运算符优先级及结合顺序随笔

简介: 运算符优先级及结合顺序随笔   最近在网上看到一段开源代码中有一个关于链表操作的代码,其中有一行如下: --pNode->next;   看到这段代码,我一时想不起这些运算符的结合顺序是什么样子了,于是开始查找资料并写了下面的测试程序: 1   // test operator...

运算符优先级及结合顺序随笔

  最近在网上看到一段开源代码中有一个关于链表操作的代码,其中有一行如下:

--pNode->next;

  看到这段代码,我一时想不起这些运算符的结合顺序是什么样子了,于是开始查找资料并写了下面的测试程序:

 1   // test operator priority
 2     typedef struct
 3     {
 4         int* next;
 5     } SturctA;
 6     
 7     int a[] = {0, 1, 2, 3 };
 8     int b = 4;
 9     SturctA temp1[2];
10     SturctA *pTemp1 = &temp1[0];
11     int val1 = 0, val2 = 0, val3 = 0;
12     
13     temp1[0].next = &a[2];
14     temp1[1].next = &b;
15     
16     val1 = *--pTemp1->next;   // equals to *(--(pTemp1->next)); after operation val1 = 1, pTemp1 = &temp1[0]
17     NSLog(@"val1 value: %d", val1);
18     
19     val2 = *--pTemp1++->next; // equals to *(--(pTemp1->next)), then pTemp1++; after operation val2 = 0, pTemp1 = &temp1[1]
20     NSLog(@"val2 value: %d", val2);
21     
22     val3 = *pTemp1->next;
23     NSLog(@"val3 value: %d", val3);

  这段代码主要作用是验证前++、--,后++、--,以及->,*的优先级和结合顺序。

  程序中第2到5行,首先定义了一个结构体,该结构体中有一个指向int型的指针。第9行定义了一个结构体数组temp1[2],紧接着在第10行定义一个指向结构体数组第0个元素的指针pTemp1。13,14两行分别对数组temp1的两个结构体的next成员变量赋初值。最后16到23行对以上提到的四种的运算符进行了几种组合,并打印测试结果。

  下面我们分别看一下几种运算符组合的具体情况:

  1. 第16行代码,改行包含了前--,->以及*运算符。结合顺序是首先pTemp1->next,然后在对拿到的next进行前--的操作,最后再取出--运算以后的指针所指向的数值。根据分析我们可以得到val1 = 1的结果。
  2. 第19行代码,在前面执行的基础上(前面的执行已经修改了next指针的指向)进行了前--,后++,->以及*操作。结合顺序是首先pTemp1进行后++的操作(注:后++操作的运算符优先级最高,但不会影响本次执行),然后在和->next结合获得next的值(指向int的指针),接着再对该指针进行前--操作,最后对再取出--运算以后的指针所指向的数值。根据分析我们可以得到val2 = 0的结果(需要考虑到执行完第16行,pTemp1->next已经指向a[1]的地址)
  3. 第22行代码,在前面执行的基础上,对pTemp1的后++操作进行了验证,可以明显的看出此时pTemp1已经指向结构体数组的第1个元素了。

  上述代码只是为了验证运算符的优先级问题,日常的代码中还是尽量避免这样写,特别是不要想19行那样,建议最好加上“()”,例如19行的代码就可以修改为下面这样:

  val2 = *(--((pTemp1++)->next)); 

  总之如果不清楚优先级和结合顺序,就多加一些“()”,这样自己看起来清晰,也方面后面维护代码的同事。


部门招人: 高级iOS、Android、前端开发,有意私聊,博主请你喝️
如果觉得本文帮到了你,记得点赞哦,当然也可以请博主喝一杯豆浆
微信二维码 QQ二维码
目录
相关文章
|
5月前
|
C语言 C++ 容器
c++primer plus 6 读书笔记 第五章 循环和关系表达式
c++primer plus 6 读书笔记 第五章 循环和关系表达式
|
6月前
|
测试技术
【刷题-牛客】出栈、入栈的顺序匹配 (代码+动态演示)
【刷题-牛客】出栈、入栈的顺序匹配 (代码+动态演示)
106 0
|
6月前
编译原理复习六:依赖图、注释语法树上节点的求值讲解(附题目与答案 超详细)
编译原理复习六:依赖图、注释语法树上节点的求值讲解(附题目与答案 超详细)
262 0
|
11月前
|
C语言
C语言二十二弹--有序数组合并
C语言二十二弹--有序数组合并
|
11月前
|
C语言
C语言二十三弹---求第N项斐波那契数列的值
C语言二十三弹---求第N项斐波那契数列的值
|
编译器 C语言
《C和指针》读书笔记(第五章 操作符和表达式)
《C和指针》读书笔记(第五章 操作符和表达式)
|
C++
C++ Primer Plus 第五章答案 循环和关系表达式
只有聪明人才能看见的摘要~( ̄▽ ̄~)~
62 0
|
存储 自然语言处理 C语言
C++ Primer Plus 第6版 读书笔记(5)第5章 循环和关系表达式
如本章前面所述,for 循环是一种处理数组的工具。下面进一步讨论如何使用嵌套 for 循环中来处理二 维数组。首先,介绍一下什么是二维数组。到目前为止,本章使用的数组都是一维数组,因为每个数组都可以看作是一行数据。二维数组更像是一个表格—既有数据行又有数据列。例如,可以用二维数组来表示 6 个不同地区每季度的销售额,每一个地区占一行数据。也可以用二维数组来表示 RoboDork 在计算机游戏板上的位置。
127 0
|
算法
数据结构上机实践第五周项目3 - 括号的匹配
数据结构上机实践第五周项目3 - 括号的匹配
数据结构上机实践第五周项目3 - 括号的匹配
|
存储 C语言
C语言学习笔记—P3(<C语言初阶>+函数<提要>+数组<提要>+操作符<提要>+关键字<提要>+图解+题例)
<C语言初阶>(函数<提要>+数组<提要>+操作符<提要>+关键字<提要>+图解+题例)
93 0
C语言学习笔记—P3(<C语言初阶>+函数<提要>+数组<提要>+操作符<提要>+关键字<提要>+图解+题例)