69,371
社区成员
发帖
与我相关
我的任务
分享
根据常见的编译器,VS和GCC的运算过程来看,显然前缀++和--优先级高于后缀++和--,,不过国内课本的附录上,普遍都写着后缀优先级高于前缀,,到底谁抄谁的,不清楚,,怀疑是以讹传讹,目前还在错误,国内和国外的课本都有这样的描述,,不过经过真理检验的经验是:
(1)前缀++a(或--a)的优先级大于所有数值运算符
(2)后缀a++(或a--)的优先级小于所有数值运算符
按照The C Programming Language第二版第二章末尾的图2-1,C语言的设计者似乎并未区分前缀和后缀的优先级;百度百科也没有区分,我们学校的教材也没有区分(把前缀放在二级,但是后缀巧妙地没有出现在优先级表格中);
但是维基百科则是仅仅给出C++的运算符优先级,而C Primer Plus第六版中的"B.2参考资料Ⅱ:C运算符"开头的优先级表格区分了前缀和后缀的优先级
a---b
2、由《C陷阱与缺陷》本节所讲的“贪心法”可得,编译器会从左到右一个字符一个字符读入,重复判断读入的这些字符能否组成一个有意义的符号;
3、那么我们就按照“贪心法”,来理解上述表达式,可以想到下边这个表达式与上边的表达式含义是一样的;
a-- - b
4、下边这种表达式,与上述两种表达式都不相同,注意看符号的连接与符号之间的空格!
a - --b
四、++(--)前缀运算符与后缀运算符的结合律
1、根据参考的资料来看,结合律应该是不一样的;
2、如果根据“贪心法”来理解结合律,感觉都应该是 从左往右 ;
3、根据百科资料中的运算符优先级结合性概念来理解,理解的不是很透彻;但是百科中也区分了前缀(前置)运算符、后缀(后置)运算符;
4、总结一下,我认为关于结合性这块,应该要区分前缀运算符、后缀运算符;因为这两种运算符的结合律不同,且后缀运算符优先级要高于前缀运算符;#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;
}
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;
}
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;
}
我这么理解对吗,这个前缀后缀,指的结合优先级