当前位置:编程学习 > C/C++ >>

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语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,