Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当用换行符分隔时,字符串文字是否一定被视为相邻(并因此连接)?_C_C99 - Fatal编程技术网

C 当用换行符分隔时,字符串文字是否一定被视为相邻(并因此连接)?

C 当用换行符分隔时,字符串文字是否一定被视为相邻(并因此连接)?,c,c99,C,C99,我认为这是一个迂腐的问题。然而,由于FAQ似乎不允许迂腐,我会继续问,因为我真的对答案感兴趣 我正在努力阅读和理解(大部分)C99标准(ISO/IEC 9899:1999)。我基本上想知道这是否是严格符合标准的代码: printf("String literal 1 " "String literal 2.\n"); 或者换行符应该这样转义: printf("String literal 1 "\ "String literal 2.\n"); 本标准的相关章节似乎是第5.1.1.2节,其中

我认为这是一个迂腐的问题。然而,由于FAQ似乎不允许迂腐,我会继续问,因为我真的对答案感兴趣

我正在努力阅读和理解(大部分)C99标准(ISO/IEC 9899:1999)。我基本上想知道这是否是严格符合标准的代码:

printf("String literal 1 "
"String literal 2.\n");
或者换行符应该这样转义:

printf("String literal 1 "\
"String literal 2.\n");
本标准的相关章节似乎是第5.1.1.2节,其中描述了翻译阶段。在第2阶段,删除每个“\”和一个换行符,将这些行拼接成一行。然后在第6阶段,连接相邻的字符串文字标记

因此,对于第一个符合标准的代码示例,我看到了两种选择:要么将由换行符分隔的字符串文字视为相邻,要么在前面的一个翻译阶段中删除换行符


那么,有人知道上面的第一个代码示例在这种情况下是否可以被认为是严格符合的吗?如果是的话,标准中是否有明确的规定?

是的,换行符只是空白。因此,您的第一个示例相当于


printf(“字符串文字1”字符串文字2.\n”)

我相信它们都是严格一致的。\是与字符串文字连接不同的功能。因此,您的第一个示例非常好:文本之间有一个新行字符,它是一个空白,因此形成了一个“序列” 如5.1.1.3所述的“空白字符”

5.1.1.2中的C标准对于\hough有点不清楚,因为它模糊地表明新行字符和反斜杠都被删除了。但在这种特殊情况下,字符串文本之间是否有空白字符并不重要,我相信您的第一个示例将被解释为

“字符串文字1”“字符串文字2。\n”


这反过来又会产生预期的输出。

我不能用标准的段落来证明这一点,但这两个选项是等效的


换行符不是字符串的一部分,因此不会影响字符串。

要正式回答您的最后一个问题,请回答“是”,并且您指向标准中的正确段落

现在,为什么不像第二段代码那样使用反斜杠呢?这根本没用

反斜杠+下线仅在极少数情况下相关,例如,在多行上定义宏时,同时保持清晰的缩进(我想不出其他任何情况)。实际上,您可以在所有行的末尾加上反斜杠,如果使用普通缩进,它将毫无问题地编译。您甚至可以在文件的所有字符之间加上反斜杠+下线<代码>printf(“…”)这样完全有效:

p\
r\
in\
t\
f\
("..\
.")\
;`

5.1.1.3是关于诊断的简短文本,您是指5.1.1.2中的翻译阶段3吗?阶段3说源代码被分解为预处理标记和空白,但是它也明确表示保留了换行符,这导致了我的混淆。换行符以何种方式被视为空白?标准似乎认为它们是不同的。是的,对不起,我指的是5.1.1.2×3。实际上在第6.4节中提到,预处理令牌可以用“空格”或“空格字符”分隔,其中“空格字符”(连字符)包括选项卡和换行符之类的东西。所以,一旦定义好了,我想我可以接受由“空白”分隔的字符串文字确实是“相邻的”(任何其他解释至少都会很奇怪)。因为我认为你是最接近的,所以我会接受你的答案,尽管所有的答案都是正确的:)根据标准(第6.4节),新行实际上是一个空白字符(带有连字符,明显不同于空白),但除此之外,你确实是正确的:)