2011-04-01 115 views
2

用下面的代码,这段代码的输出是什么,为什么?这段代码的输出是什么,为什么?

#include <stdio.h> 

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

它不与C89编译器来编译。 – pmg 2011-04-01 22:46:50

回答

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):

反斜线字符的每个实例(\)紧跟一个新行字符 被删除,拼接物理源代码行以形成逻辑源代码行。

2

这是“Hello world \ n”。你不试试吗?续行(例如trigraphs)是有据可查的,请查看它。语法高亮编辑器(例如VA X的Visual Studio)将使这一点变得明显。

注意,这部作品在C99和C++ - C89

+0

这就是我的想法,但我使用的编辑器(xcode和nano)没有做突出显示,认为这是别的东西......会尝试与另一个文本编辑器。 – Josejulio 2011-04-01 22:50:05

+0

@ user688379:正如其他答案所说,由于最终反斜杠 – Erik 2011-04-01 22:50:56

+1

@ user688379,所以它只是行延续:另外,作为一个附注,如果这是来自某本书,请将其弃掉,但它不会教你C但C技巧。 – Erik 2011-04-01 22:52:57

1

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

这是因为“线拼接”在转换阶段2时,同时删除注释在第3阶段

新的编译器会发出警告的单行注释被延续到下一行发生(我不知道到底是什么警戒水位可能需要虽然):

  • GCC 4.5.1(MinGW的)

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

    C:\temp\test.c(5) : warning C4010: single-line comment contains line-continuation character 
    
相关问题