【发布时间】:2014-02-20 04:11:37
【问题描述】:
我正在练习 K&R2。当我在本页http://clc-wiki.net/wiki/K%26R2_solutions:Chapter_1:Exercise_23 中阅读 Ben Pfaff 的代码时,我无法理解单个代码 putchar('/' //*/ 1) 的含义。在我的编译器中,这是一个语法错误。所以任何人都可以向我解释这一点。
【问题讨论】:
-
那是注释和除法运算符。
我正在练习 K&R2。当我在本页http://clc-wiki.net/wiki/K%26R2_solutions:Chapter_1:Exercise_23 中阅读 Ben Pfaff 的代码时,我无法理解单个代码 putchar('/' //*/ 1) 的含义。在我的编译器中,这是一个语法错误。所以任何人都可以向我解释这一点。
【问题讨论】:
如果您阅读解决方案开头的 cmets,它会解释您看到该错误的原因:
它还包含以星号和 斜线前面的注释。注意后者会破坏C99 // 注释扩展的编译器和 C89 编译器。
在不支持 // 样式 cmets 的编译器中,这个:
putchar('/' //**/
1)
相当于:
putchar('/'/1)
这是合法的——虽然是奇怪的——表达式(请记住,在 C 中,char 是数字类型,所以'/'/1 与/ 相同)。发生这种情况是因为序列/**/ 是一个空注释。
在具有// 样式 cmets 的现代编译器中,表达式最终等同于:
puchar('/' 1)
这只是一个错误。
【讨论】:
为了清楚起见,将原始代码放在多行中,如下所示:
putchar('/' //**/
1);
从这里开始,/**/ 部分是注释,所以经过预处理后,代码如下所示:
putchar('/' / 1);
等于putchar('/');
您收到编译器错误,因为您正在将此代码编译为 C99,或者很可能编译为 C++,其中 // 是单行注释。改为编译为 C89。
抱歉格式错误 - 用我的手机写...
【讨论】: