Что выводит этот код и почему? - PullRequest
2 голосов
/ 02 апреля 2011

С помощью следующего кода, что выводится этот код и почему?

#include <stdio.h>

int main() {
        printf("Hello world\n"); // \\
        printf("What's the meaning of this?");
        return 0;
}

Ответы [ 3 ]

10 голосов
/ 02 апреля 2011

Обратная косая черта в конце 4-й строки экранирует следующую новую строку, так что они становятся одной непрерывной линией.И поскольку мы можем видеть // начало комментария, 5-я строка закомментирована.

То есть ваш код эквивалентен:

#include <stdio.h>

int main() {
        printf("Hello world\n"); // \printf("What's the meaning of this?");
        return 0;
}

Вывод просто "Helloworld "с новой строкой.

Редактировать: Как сказали оба Эрика и pmg, это верно в C99, но не в C89.Кредит при наличии кредита.

Он определен на 2-й фазе перевода (ISO / IEC 9899: 1999 §5.1.1.2):

Каждый экземпляр символа обратной косой черты (\) сразу после него удаляется символ новой строки, объединяя физические исходные строки для формирования логических исходных строк.

2 голосов
/ 02 апреля 2011

Это "Привет, мир \ n".Ты не пробовал?Продолжение строки (и, например, триграфы) хорошо задокументировано, посмотрите.Редактор подсветки синтаксиса (например, Visual Studio с VA X) сделает это очевидным.

Обратите внимание, что это работает в C99 и C ++ - , а не C89

1 голос
/ 02 апреля 2011

Завершающий обратный слеш приводит к тому, что следующая строка «соединяется» со строкой, заканчивающейся обратной косой чертой, даже если она является частью комментария. Это почти всегда непреднамеренно (если только это не преднамеренный трюк с запутыванием) и приведет к ошибке, если следующая строка не будет полностью пропущена или сам комментарий.

Это происходит потому, что «объединение строк» ​​происходит на этапе перевода 2, а удаление комментариев - на этапе 3.

Новые компиляторы будут предупреждать о том, что однострочный комментарий продолжается до следующей строки (хотя я не уверен, какой именно уровень предупреждения может потребоваться):

  • GCC 4.5.1 (MinGW)

    C:\temp\test.c:4:34: warning: multi-line comment
    
  • MSVC 9 (VS 2008) или 10 (VS 2010):

    C:\temp\test.c(5) : warning C4010: single-line comment contains line-continuation character
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...