C语言运算符优先级普遍存在的一个深层次误区
国内许多C语言教科书,在介绍C语言运算符时,都把所谓的“单目运算符”归纳为优先级相同结合性从右向左的运算符。例如号称是“我国广大初学者学习C语言程序设计的主流用书”的《C程序设计》(谭浩强著,清华大学出版社,2010年6月(第四版))的378页附录D 运算符和结合性 中就是这样:
附录D 运算符和结合性
优先级 运算 含义 要求运算对象的个数 结合方向
1( ) 圆括号 自左至右
[ ] 下标运算符
-> 指向结构体成员运算符
. 结构体成员运算符
2 1(单目运算符) 自右至左
! 逻辑非运算符
~ 按位取反运算符
++ 自增运算符
-- 自减运算符
- 负号运算符
(类型) 类型转换运算符
* 指针运算符
& 取地址运算符
sizeof 长度运算符
殊不知,这种归纳是完全错误的。而且恰恰由于《C程序设计》是所谓的“主流用书”,其错误带来的影响也是广泛普遍的和灾难性的。(google或百度一下“所有的单目运算符具有相同的优先级”,你就会知道我是不是在夸大其词危言耸听)。为了揭示“所有的单目运算符具有相同的优先级”的错误,下面首先按照这种错误的说法进行一个实验。
我们都知道,对于
int i;
来说,&i是求得一个指向i的指针(注意这里的“&”是一个“单目运算符”),&i的数据类型显然是“int *”。
如果对“int *”类型的表达式“&i”做“(int *)”类型转换运算(可能显得有点无聊)
(int *)&i
得到显然还是“&i”——值和类型都没有任何改变。
按照“所有的单目运算符具有相同的优先级”这个错误的说法,由于“&” 和“(int *)”的结合性从右向左
(int *)&i
这个表达式没有任何毛病,也不需要通过加“()”来明确运算对象。
现在,再对
(int *)&i
这个表达式做sizeof运算,由于sizeo
补充:软件开发 , C语言 ,