《C语言深度剖析》笔记 之 符号和预处理

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


   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值