怎么理解++的后缀运算符的优先级高于前缀的优先级?

院里有座山 2020-03-11 10:37:43

不是i++,先使用后增量吗?
能否举个例子,说明后缀的优先级高于前缀
...全文
1519 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_22636165 2022-04-13
  • 打赏
  • 举报
回复

根据常见的编译器,VS和GCC的运算过程来看,显然前缀++和--优先级高于后缀++和--,,不过国内课本的附录上,普遍都写着后缀优先级高于前缀,,到底谁抄谁的,不清楚,,怀疑是以讹传讹,目前还在错误,国内和国外的课本都有这样的描述,,不过经过真理检验的经验是:
(1)前缀++a(或--a)的优先级大于所有数值运算符
(2)后缀a++(或a--)的优先级小于所有数值运算符

sxeqs 2021-06-19
  • 打赏
  • 举报
回复

按照The C Programming Language第二版第二章末尾的图2-1,C语言的设计者似乎并未区分前缀和后缀的优先级;百度百科也没有区分,我们学校的教材也没有区分(把前缀放在二级,但是后缀巧妙地没有出现在优先级表格中);

但是维基百科则是仅仅给出C++的运算符优先级,而C Primer Plus第六版中的"B.2参考资料Ⅱ:C运算符"开头的优先级表格区分了前缀和后缀的优先级

FightingBoom 2020-10-31
  • 打赏
  • 举报
回复 1
顶一下,我也刚好在看这里,谈谈我自己的理解,希望对您有帮助! 一、参考资料: 1、《C陷阱与缺陷》,第 1.3 节,P8 ;第 2.2 节,P19 ; 2、《C Primer Plus (第6版)中文版》,附录 B.2 ,P667 ; 3、《C程序设计语言 (第2版)》,第 2.12 节,P42 ; 4、百度百科 - 运算符优先级 :https://baike.baidu.com/item/%E8%BF%90%E7%AE%97%E7%AC%A6%E4%BC%98%E5%85%88%E7%BA%A7/4752611?fr=aladdin 二、问题疑惑: 1、如楼主所问,在看参考资料 2 时,有一个疑问,为什么 ++ 的后缀运算符比前缀运算符优先级高? 2、++(--)前缀运算符与后缀运算符的结合律一样吗? 三、基础理解: 1、++ 的后缀运算符:a++; 2、++ 的前缀运算符:++b; 3、-- 运算符也是类似; 由参考资料 1 的一个实际情况举例: 1、如下代码应该怎么理解?

a---b
2、由《C陷阱与缺陷》本节所讲的“贪心法”可得,编译器会从左到右一个字符一个字符读入,重复判断读入的这些字符能否组成一个有意义的符号;
引用
引用书中解释:编译器将程序分解成符号的方法是,从左到右一个字符一个字符地读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分:如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号。
3、那么我们就按照“贪心法”,来理解上述表达式,可以想到下边这个表达式与上边的表达式含义是一样的;

a-- - b
4、下边这种表达式,与上述两种表达式都不相同,注意看符号的连接与符号之间的空格!

a - --b
四、++(--)前缀运算符与后缀运算符的结合律 1、根据参考的资料来看,结合律应该是不一样的; 2、如果根据“贪心法”来理解结合律,感觉都应该是 从左往右 ; 3、根据百科资料中的运算符优先级结合性概念来理解,理解的不是很透彻;但是百科中也区分了前缀(前置)运算符、后缀(后置)运算符;
引用
引用百科资料 - 结合性 当一个运算对象两侧的运算符优先级别相同时,则按运算符的结合性来确定表达式的运算顺序。关于结合性的概念在其他高级语言中是没有的,这是C语言的特点之一。 它是仲裁者,在几个操作符具有相同的优先级时决定先执行哪一个。
4、总结一下,我认为关于结合性这块,应该要区分前缀运算符、后缀运算符;因为这两种运算符的结合律不同,且后缀运算符优先级要高于前缀运算符;
院里有座山 2020-03-11
  • 打赏
  • 举报
回复
哦哦,明白了。
lin5161678 2020-03-11
  • 打赏
  • 举报
回复 1
C语言 不用考虑 前缀后缀哪个优先级高 因为这两个运算符根本无法摆在同一个表达式上面
孤远无梦 2020-03-11
  • 打赏
  • 举报
回复
#include<stdio.h> 
int main()
{
int a[] = {10,20,30,40,50};
int* b = a;
int* d = a;
printf("%d\n", ++d++[2]);
printf("%d\n",(++b)++[2]);
printf("%p\n", d);
printf("%p\n",b);
return 0;
}

可以这样试一下
ggglivw 2020-03-11
  • 打赏
  • 举报
回复 1
你又不可能一行中对一个变量同时++--,或者前缀后缀++-- 一起用。所以可以不管.
院里有座山 2020-03-11
  • 打赏
  • 举报
回复 1

int main(void)
{
int a[] = {10,20,30,40,50};
int* b = a;
int* c = a;
int* d = a;
printf("%d\n", a[0]);
printf("%p\n", b);
printf("%d\n", b++[0]);
printf("%p\n", b);
printf("%p\n", c);
printf("%d\n", ++c[0]);
printf("%p\n", c);
printf("\n");
printf("%p\n", d);
printf("%d\n", ++d++[2]);
printf("%p\n", d);
return 0;
}

这么理解可能对了。
院里有座山 2020-03-11
  • 打赏
  • 举报
回复
引用 1 楼 ?Victor.?? 的回复:
我们书上是这么写的

优先级 1 初等运算 [ ] ( ) -> .

2 自增自减 后置++ 后置--

3 一元运算 前置++ 前置-- 加号+ 减号- & * ~ ! sizeof()

……


int main(void)
{
int a[] = {10,20,30,40,50};
int* b = a;
int* c = a;
printf("%d\n", a[0]);
printf("%p\n", b);
printf("%d\n", b++[0]);
printf("%p\n", b);
printf("%p\n", c);
printf("%d\n", ++c[0]);
printf("%p\n", c);
return 0;
}
我这么理解对吗,这个前缀后缀,指的结合优先级
孤远无梦 2020-03-11
  • 打赏
  • 举报
回复
我们书上是这么写的

优先级 1 初等运算 [ ] ( ) -> .

2 自增自减 后置++ 后置--

3 一元运算 前置++ 前置-- 加号+ 减号- & * ~ ! sizeof()

……
做一门精致,全面详细的 java数据结构与算法!!!让天下没有难学的数据结构,让天下没有难学的算法,不吹不黑,我们的讲师及其敬业,可以看到课程视频,课件,代码的录制撰写,都是在深夜,如此用心,其心可鉴,他不掉头发,谁掉头发???总之你知道的,不知道的,我们都讲,并且持续更新,走过路过,不要错过,不敢说是史上最全的课程,怕违反广告法,总而言之,言而总之,这门课你值得拥有,好吃不贵,对于你知识的渴求,我们管够管饱话不多说,牛不多吹,我们要讲的本门课程内容:稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧