关于C语言运算符优先级的问题

k906325292 2009-07-08 02:06:29
a=c[b++]
该怎么运算呀,为什么是先赋值后加1操作呢……
k=(x++,y++);
k=x++,y++;
还有这2个式子的结果一样吗?第一个我知道是把Y得值赋给K(这是逗号表达式的规则),但是第二个呢……
刚开始学运算符本来觉得挺简单的,结果越深入学搞的越迷糊……特别是优先级和结合性这方面
还有一个式子
int a=10;
a+=a-=a*=a;
这个式子完全不知道该怎么入手……希望高手赐教
在下感激不尽……
...全文
264 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
北辰猫咪 2009-07-08
  • 打赏
  • 举报
回复
a=c[b++] // 在变量后面的++符号必须在其所在表达式运行完之后才会给b加上1。如果放在b的前面就会先给b加1,然后再运行表达式
k=(x++,y++);
k=x++,y++;
// ()里面是逗号表达式,表达式的值是最后一个表达式的值。++符号前面已经说过。按照优先级来说,第二个式子应该由k=x++和y++组成的逗号表达式,结果自然是y的值。
int a=10;
a+=a-=a*=a;
// 这个式子的执行顺序是:
1: a+=a-=(a*=a);
2: a+=(a-=(a*=a));
下面就知道了吧。
呵呵,c语言很重要的,加油啊~
Crazy_hand 2009-07-08
  • 打赏
  • 举报
回复
对不起。楼主 。我说错话了。
应该是 ”大烧饼“ ,没有“兰州”的(习惯一起写了。。)
在说声“对不起,不是有意那样写的。”
Crazy_hand 2009-07-08
  • 打赏
  • 举报
回复
不要倒腾了,如果想连用就用括号把运算顺序括出来,要不就直接多写几句,把它写清楚。这样真的没什么意义

第三个式子,兰州大烧饼才会那样写。
Fleeboy 2009-07-08
  • 打赏
  • 举报
回复
书上都写得很清楚。
yxd_1982 2009-07-08
  • 打赏
  • 举报
回复
1. a=c[b++]
先算[]里面,这里++是后置,所以先取b的值,然后b++,这个相当于: a=c[b], b++;


2.k=(x++,y++);
k=x++,y++;
肯定是不一样的。主要区别是第一个有括号;第一个相当于:k=y; 第二个相当于: k=x;

3.int a=10;
a+=a-=a*=a;
这个并不难,关键是找到破解点。赋值运算符的结合方向是从右向左,所以运算顺序是:
a=a*a;(这时a=10*10=100)
——>
a=a-a;(a=100-100=0)
——>
a=a+a;(a=0+0=0)
Walf_ghoul 2009-07-08
  • 打赏
  • 举报
回复
第三个,个人感觉是0,中间有个a -= a。。。
Walf_ghoul 2009-07-08
  • 打赏
  • 举报
回复
第二个就是运算符的优先级问题了

k=(x++,y++); //将y增值前的值赋给k
k=x++,y++; //将x增值前的值赋给k
Walf_ghoul 2009-07-08
  • 打赏
  • 举报
回复
先看x++,++x,两个都会对x加一,但是x++在加一前产生拷贝,用于周围的表达式,而++x在加一后产生拷贝,用于周围的表达式,所以单独使用时两者是没有区别的,和别的有联系时,就有差别了。。
「已注销」 2009-07-08
  • 打赏
  • 举报
回复
第一个和第三个还能理解……
第二个就不明白了,就那2个逗号表达式
根据3楼和4楼的说法,第一个式子可以说是用K来表示括号里面那个逗号表达式的值,那么第二个式子呢?
如果说K仅仅用来表示X++的值,那用什么变量来表示整个逗号表达式的值呢?
整个逗号表达式的值就是子表达式y++的值,这仅仅是一种说法吗?(不能用某个变量来表示?)
不知道有没有人能听懂我说的什么意思……
飞天御剑流 2009-07-08
  • 打赏
  • 举报
回复
a=c[b++]
该怎么运算呀,为什么是先赋值后加1操作呢……
-----------------------------------------
那个++是后增量啊,后增量就是b先应用了再自加一,就是先计算a = c[b],再计算b = b + 1



k=(x++,y++);
k=x++,y++;
还有这2个式子的结果一样吗?第一个我知道是把Y得值赋给K(这是逗号表达式的规则),但是第二个呢……
刚开始学运算符本来觉得挺简单的,结果越深入学搞的越迷糊……特别是优先级和结合性这方面
----------------------------------------------------------------
赋值运算符的优先级比逗号运算符要高,因此x++子表达式是赋值运算符的操作数,先计算k=x++,再计算y++,整个逗号表达式的值就是子表达式y++的值,而y++

的值就是y的值,y的值先应用后,再自加一。





int a=10;
a+=a-=a*=a;
这个式子完全不知道该怎么入手……希望高手赐教
-----------------------------------------
+=、-=和*=的优先级相同,结合性从右到左,因此这表达式可如下划分:a += ( a -= ( a *= a ) )

但是,赋值运算符的求值顺序是实现相关的,就是说,对于a + b来讲,先计算a还是先计算b,不同编译器的顺序是不同的,因此,a+=a-=a*=a表达式的结果

会因编译器而异。
Arnold9009 2009-07-08
  • 打赏
  • 举报
回复
a=c[b++]
变量后面的++运算符本来就是在表达式的值计算完之后再加

k=(x++,y++);
k=x++,y++;
这两个表达式的结果完全不一样
第一个表达式是将括号里的逗号表达式的值赋给k
第二个表达式是一个逗号表达式,这个表达式的结果是最右边的表达式的值

赋值运算都是从右至左求值的,所以a+=a-=a*=a; 的计算顺序为:
先计算a*=a的值赋给a
然后计算a-=a的值赋给a
然后再计算a+=a的值
最终结果应该是a=0
ysuliu 2009-07-08
  • 打赏
  • 举报
回复
个人觉得不必深究。。这些东西只会出现在书上或者考试中。。。

工作中绝对不会有的,首先一点就是编译器在这种复杂表达式都有可能有区别,再有,即使你是大牛,写出这样的代码,也会被人骂的。。
大前置 2009-07-08
  • 打赏
  • 举报
回复
a=x++; //先赋值后加1操作
b=++x; //先加1后赋值

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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