请教int a=1,b=2;int c=a+b+(++a);

bkwan2008 2011-09-29 11:00:55
int a=1,b=2;
int c=a+b+(++a);
问这个结果是什么,怎么解释。
(++的优先级高于+.)


后来又发现一个问题
int a=0,b=5;
(a<b)||(a=b)&&(b=15);
执行后a=_____;b=_______;

结果为a=0;b=5;

解释起来比较费劲,说是因为“||”的短路操作,但是&&的运算优先级比||高,为什么不先算后面的。于是解释,优先级就相当于打上了括号,
所以变成(a<b)||((a=b)&&(b=15)); 因为(a<b)为真,没进行后面计算。

...全文
615 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
feidegengao 2011-09-29
  • 打赏
  • 举报
回复
要看编译器的
rivorhua 2011-09-29
  • 打赏
  • 举报
回复
给你分析一下:c=a+b+(++a)吧:
1. a(1) 入操作数栈,+ 入操作符栈;
2. b(2) 入操作数栈,+(第二个加号) 与操作符栈栈顶的加号相比,优先级相同,出栈并运算第一个加号:取出操作数所栈中的两个数运算!把结果入操作数栈(3)。再把第二个加号入栈。
3. 取(运算级高于+ 所以入栈 ,再取++运算,因前一个为(所以也入栈;再取 a(1)入栈;
4. 取),高于++,要运算到(之前的所有运算符,所以运算++ ,操作数变为a(2)入栈! )直接出栈,与)对消;
5. 没有运算符了,取出操作符栈中最后一个运算符,+ 取出作数栈中的两个操作数3 , 2 ,最后结果5
bkwan2008 2011-09-29
  • 打赏
  • 举报
回复
自己搞定了

运算符优先级不是运算优先级,而是结合性优先级,意指:高优先级的运算符所结合的变量或表达式,不能被低优先级的运算符分离。
前缀的++与后缀的++具有同样的优先级,只是执行结果不一样。他们的结合性优先级都高于&&,但是他们的运算优先级要低于||,表达式在取值时,按照递推结合,递归返回的顺序运算,所以编译器会先处理优先级低的运算符。
举个简单的例子:a+b*c,编译器会先处理+号,得知最终返回的是和值,然后再分析加号的左右两个操作数,或者操作表达式。

对于运算符的优先级和结合性其实更因该看作是各运算符对其操作数联系的紧密程度,也就是决定了运算符的操作数是哪个,比如 d = a + b * c; 这个表达式,因为*的优先级最高所以*就可以先占有操作数b,而+只能占有操作数a和 b*c的积作为自己的操作数.而=的优先级最低,所以它的操作数就是d和a+b*c.

yxriyin 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bkwan2008 的回复:]

谢谢,但是怎么给学生解释,比如说*优先级高于+,那么先乘除后加减
$$优先级高于||,结果反而是先做||。
虽然说有一个特定的短路操作,难道就解释说,这个是一个特例吗?


第一个问题我是想知道计算机计算是先算优先级高的,还是按照计算次序(比如从左到右)计算,优先级只是代表它们要先结合起来(用括号括起来)。

引用 3……
[/Quote]
这和优先级没有关系的
c++语言本身不保证从左到右的计算顺序
是编译器,自己实现计算顺序的,所以是看编译器而定的
在a++之前就可能把a+b算好,或者先a++了,在算a+b,这是看编译器的具体行为的吧
jixiang1983 2011-09-29
  • 打赏
  • 举报
回复
第一个既然与编译器有关,研究它也没有意义了,自己写代码时不会那样写就OK了。
第二个,对||操作符,只要它左侧的条件成立,右侧的条件就不会再做判断了(一个条件成立整个条件就成立了)
bkwan2008 2011-09-29
  • 打赏
  • 举报
回复
"++a先加加再参加运算,a++先运算进行加加"这个我知道,我说想问
int c=a+b+(++a);
这句话中,++的优先级最高,是不是要先算它?

""

[Quote=引用 5 楼 rivorhua 的回复:]
++a先加加再参加运算,a++先运算进行加加

(a<b)||(a=b)&&(b=15);

这个你要学过编译原理,就好理解点了!他们是有一点运算顺序的!按栈处理的!
[/Quote]
bkwan2008 2011-09-29
  • 打赏
  • 举报
回复
谢谢,但是怎么给学生解释,比如说*优先级高于+,那么先乘除后加减
$$优先级高于||,结果反而是先做||。
虽然说有一个特定的短路操作,难道就解释说,这个是一个特例吗?


第一个问题我是想知道计算机计算是先算优先级高的,还是按照计算次序(比如从左到右)计算,优先级只是代表它们要先结合起来(用括号括起来)。

[Quote=引用 3 楼 bdmh 的回复:]
第一个和编译器有关,自己看看汇编代码
第二个 || 操作,满足一个后面不会被执行
[/Quote]
rivorhua 2011-09-29
  • 打赏
  • 举报
回复
++a先加加再参加运算,a++先运算进行加加

(a<b)||(a=b)&&(b=15);

这个你要学过编译原理,就好理解点了!他们是有一点运算顺序的!按栈处理的!
yxriyin 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bkwan2008 的回复:]

你说的是多少个+怎么结合的问题,而且你说的问题对我不存在,我已经用括号把++括起来了,什么计算机都会得到一样的编译结果,我说的是++和其他运算符优先级及计算次序的问题。

优先级高的,代表先计算,还是先结合不计算,然后从左往右计算。

如果优先级高就先计算,那么
int a=1,b=2;
int c=a+b+(++a);
先计算++a,然后得到结果c=2+2+2=6;

如果是……
[/Quote]
第一个不是结合的问题
编译器做法不同的
和结合没关系
bdmh 2011-09-29
  • 打赏
  • 举报
回复
第一个和编译器有关,自己看看汇编代码
第二个 || 操作,满足一个后面不会被执行
bkwan2008 2011-09-29
  • 打赏
  • 举报
回复
你说的是多少个+怎么结合的问题,而且你说的问题对我不存在,我已经用括号把++括起来了,什么计算机都会得到一样的编译结果,我说的是++和其他运算符优先级及计算次序的问题。

优先级高的,代表先计算,还是先结合不计算,然后从左往右计算。

如果优先级高就先计算,那么
int a=1,b=2;
int c=a+b+(++a);
先计算++a,然后得到结果c=2+2+2=6;

如果是优先级高,但是先结合不计算,那么
结果是c=1+2+2=5;

这和
yxriyin 2011-09-29
  • 打赏
  • 举报
回复
这种问题个人认为意义不大
a=1;
b=++a+++a;
不同编译器貌似不一样

70,005

社区成员

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

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