y = x/*p /* p
指向除数 */;
实际上,/*开始了一个注释,因此编译器简单地吞噬程序文本,直到*/的出现。换句
话说,这条语句仅仅把 y 的值设置为 x 的值,而根本没有看到 p。将这条语句重写为:
y = x / *p /* p
指向除数 */;
或者干脆是
y = x / (*p) /* p
指向除数 */;
它就可以做注释所暗示的除法了。
这种模棱两可的写法在其他环境中就会引起麻烦。例如,老版本的 C 使用=+表示现在
版本中的+=
。这样的编译器会将 a=-1;
视为 a =- 1; 或
a = a - 1;
这会让打算写
a = -1;
的程序员感到吃惊。
另一方面,这种老版本的 C
编译器会将 a=/*b;
断句为 a =/ *b;
尽管/*
看起来像一个注释。 1.4 例外
组合赋值运算符如+=实际上是两个记号。因此,
a + /* strange */ = 1
和 a += 1
是一个意思。看起来像一个单独的记号而实际上是多个记号的只有这一个特例。特别
地, p - > a
是不合法的。它和 p -> a
不是同义词。
另一方面,有些老式编译器还是将=+视为一个单独的记号并且和+=是同义词。
1.5 字符串和字符
单引号和双引号在 C 中的意义完全不同,在一些混乱的上下文中它们会导致奇怪的
结果而不是错误消息。
包围在单引号中的一个字符只是编写整数的另一种方法。这个整数是给定的字符在实
现的对照序列中的一个对应的值。因此,在一个 ASCII 实现中,'a'和 0141 或 97 表示完全
相同的东西。而一个包围在双引号中的字符串,只是编写一个有双引号之间的字符和一个
附加的二进制值为零的字符所初始化的一个无名数组的指针的一种简短方法。
下面的两个程序片断是等价的:
printf("Hello world\n");