2

编译器不应该忽略所有介于两者之间/*的所有内容*/吗?它不应该在 C 程序中无处不在,就像不存在一样被忽略吗?为什么在我的程序中它在最不可能的地方工作,但是在其他地方失败?评论的规则是什么?在我的以下程序中观察评论背后的原因是什么?

#include<stdio.h>
#include<string.h>


int main(void)
{
char str1/*works*/[90];  //comment works
FILE *fp=fopen("D:\\source.txt","r");
if(fp==NULL){p/*Fails*/rintf("ERROR");return 0;}  //comment fails
while(fgets(str1,8/*Fails*/9,fp)!=NULL)  //comment fails
{
    if(strstr(str1,"999.999")==/*Works*/NULL)  //comment works
    printf("%s",str1);
}
fclose/*Works*/(fp);  //comment works

}
4

4 回答 4

15

它只适用于可以插入空格的地方(空格、制表符、换行符)。

于 2013-05-16T07:59:23.267 回答
6

解析器将注释视为空格。所以当你把它放在8和之间时9,你不再有一个数字,你有两个用空格隔开的数字。

于 2013-05-16T07:59:59.327 回答
2

C99 表示在预处理之前有一个翻译阶段。在翻译阶段 3 中,注释被替换为空格。所以很明显你的程序不会编译。这在 C99 的第 6.10 节中给出。

char str1 [90];  

是有效的(和之间的空格str1[。因此它编译。

然而

p rintf("ERROR");

无效。因此它不编译。

于 2013-05-16T08:10:38.317 回答
0
if(fp==NULL){p/*Fails*/rintf("ERROR");return 0;}  //comment fails

这里编译器将您的代码视为 /p rintf/ ,因为注释似乎是一个空白,所以这就是您的注释失败的原因。

while(fgets(str1,8/*Fails*/9,fp)!=NULL)  //comment fails

同样的错误,/8 9/ 编译器解释的无效。

于 2013-05-16T08:08:14.293 回答