1. 关于几个似是而非的注释问题
a) int/*...*/i; //注释放在类型和变量之间
b) char * s = "abcedf //hijklm"; // 注释符在字符串里面
c) // 注释写在多行中,使用换行符是否有效
// Is it a \
valid comment?
d) in/*...*/t i; // 注释在一个类型名的字符中间是否可以
上面四条,仅d不正确,其他三条皆为有效语句,关于 d,由于注释在编译或预处理时换作空格处理,因此当作为空格处理后,
显然 d 的语句是有问题的。
int y = k /* p; 本句也需要注意, / 和 × 在代码中出现,它们之间没有空格,编译器则将它们认作注释的开始,否则当作除法与指针。
修改为正确格式: int y = k / *p; 或 int y = k / (*p);
2. 关于++ 与 --
int i = 3;
(++i) + (++i) + (++i);
表达式结果如何? 15?16?还是18? 都有可能。
先计算括号,那么 i 自加了三次,i = 6; 然后再相加,结果为18。前两个括号中 i 自加,然后做加法,再和第三个括号相加,结果16。
因此不同的平台结果不同,只有使用代码进行测试。
去掉阔括号后 ++i+++i+++i;
此式子如何处理?简直晕菜了。作者的方法是贪心法,按照从左到右的顺序,一次进行匹配。也即每一个符号应该包含尽可能多的字符,
注意字符串,字符常量以及运算符等 本符号中间不能出现空白,否则按照其他形式处理。
++i+++i+++i; 自然被分解为: (++i) + (++i) + (++i);
3. 关于处以负数和模负数的情况
2/(-2)的值,2%(-2)的值?
q = a / b;
r = a % b;
这两个式子的四个变量满足的关系:
q * b + r == a
a变号,则希望q的符号也随之变化,q的绝对值不会发生变化。
因此 2/(-2) == -1; 2 %(-2) == 0;
4. 宏定义
#define ENG_PATH_1 E:\English\listen_to_this\listen_to_this_3
#define ENG_PATH_2 "E:\English\listen_to_this\listen_to_this_3"
#define ENG_PATH_3 E:\English\listen_to_this\listen\
_to_this_3
#define ENG_PATH_4 E:\\English\\listen_to_this\\listen_to_this_3
由于编译器对宏定义不做判断,因此编译都没有问题,但是第1,3,4条似乎在程序中无法使用。因为宏定义是直接进行宏替换,替换后貌似都是无法处理的一串。
注:不能用宏定义来定义注释符号,因为编译时,注释的处理要早于宏定义,在宏定义替换之前已经将注释处理掉了,再进行替换后,又出现注释,显然错误。
By Andy