C专家编程学习中的笔记
本文档基于《c专家编程.pdf》中文版问题结合《C语言程序设计》<谭浩强>(第三版),所进行实验的运行环境是Linux2.6内核和VC++6.0,原书作者代码均是以标准C来写的,结果只有Linux上相符合。
P43
apple = sizeof(int) *p;
1、
当其中的int为类型名时,sizeof(int)为一个整体(43页有原话,当sizeof的操作数是个类型名时,两边必须加上括号,但操作数如果是变量则不必加括号)。
1.1、
当*为指针时,(《C语言程序设计》<谭浩强>)P365附录C, sizeof长度运算符和*指针运算符相同优先级,且自右向左结合。故原语句相当于,apple = 4 *(指针)p;所以错误。
1.2、
当*为乘号时,由于乘号优先级低于长度运算符,故原语句相当于,apple = 4 *(乘号)p;p为非负整数,没有错。
2、
当()为类型转换运算符时。
2 .1、
当*为指针时,sizeof 、()、* 三者优先级相同,且从右至左结合。*p 就为一指针,(int) *p 就是将指针类型强制转为int类型,此时原语句相当于,apple = sizeof int ;上面说过,当sizeof的操作数是个类型名时,两边必须加上括号,所以会报错。改为,apple = sizeof((int) *p) ;这时候正确。
2.2、
当*为乘号时,sizeof(int)优先级高于*(乘号),()不是类型转换运算符。故原语句相当于,apple = 4 *p ; p为非负整数,没有错。
P51
z = y+++++x;
先对++运算符做下总结:
(《C语言程序设计》<谭浩强>)P58
(1)、自增运算符(++)和自减运算符(--)只能用于变量,而不能用于常量或表达式,如(a+b)++不合法的;
(2)、++和--的结合方向是“自右向左”;
《c专家编程.pdf》P51:
z=y+++x;程序员的意图可能是 z = y + ++x; 但也可能是 z = y++ + x;
ANSIC规定了一种逐渐为人所熟知的“maximal munch stratety(最大一口策略)”。这种策略表示如果下一个标记有超过一种的解释方案,编译器将选取能组成最长字符序列的方案。以上面这个例子为例,它将被解析为 z = y++ + x;
按上面的策略 z = y+++++x; 将被解析为 z = y++ ++ + x;这将引起编译错误。这个在我的运行环境下也仍报错;
但是后面说编译器能够推断(从理论上说)惟一有效的编排方式是 z = y++ + ++x; 它还是出现编译错误。但是在本人运行环境下按 z = y++ + ++x; 输入语句,不出现错误,且能正确编译运行。
本人认为这是由于这本书在写的时候,与现在所用的编译器不同,现在的编译器具有更强
的自动识别能力,所以能够编译运行,但重要声明,输入格式必须从理论上是正确的,编译器才能正确识别。
这里写入几个相关++的表达式,叙述一下:
j = ++i++;(周立功公司内部C考试题) 这是 j = (++i)++; ?还是 j = ++(i++); ?
理论上:由最大一口策略,