这段代码的输出是什么?为什么?

时间:2011-04-01 22:42:15

标签: c gcc comments

使用以下代码,此代码的输出是什么,为什么?

#include <stdio.h>

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

3 个答案:

答案 0 :(得分:10)

第4行末尾的反斜杠正在转义以下新行,使它们成为一条连续的行。因为我们可以看到//开始评论,所以第5行被注释掉了。

也就是说,您的代码相当于:

#include <stdio.h>

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

输出只是“Hello world”,带有一个新行。

编辑:正如Erik和pmg都说的那样,这在C99中是正确的,但不是C89。信用到期的信用。

它在翻译的第二阶段(ISO / IEC 9899:1999§5.1.1.2)中定义:

  

反斜杠字符(\)的每个实例后面紧跟一个换行符   删除字符,拼接物理源行以形成逻辑源行。

答案 1 :(得分:2)

这是“Hello world \ n”。你没试过吗?线条延续(例如三角形)有很好的记录,请查阅。语法高亮编辑器(例如带有VA X的Visual Studio)将使这一点显而易见。

请注意,这适用于C99和C ++ - C89

答案 2 :(得分:1)

尾随反斜杠导致下一行被“拼接”到以反斜杠结尾的行 - 即使它是注释的一部分。这几乎总是无意的(除非它是故意的混淆技巧),并且除非下一行完全是空格或注释本身,否则会导致错误。

这是因为在翻译阶段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