主题:帮忙解释一下下面表达式的值是怎么来的
PLB316369813
[专家分:0] 发布于 2011-10-15 00:13:00
计算下列表达式的值(表达式运行前i=2,j=3)
(1) (i++)+(++j)=6 为什么?
(2) --j*5+(!j==!i) =11 怎么算的?
(3) (++i==j)*++j =4 也看不懂
(4) !i++*8 =0
就好像第一题i++就变了3 然后++j就变成了4 那3+4就应该是7 为什么我的书上的参考答按是6??
不好意思本人刚学很多基础都不太理解, 求高手们帮帮忙解释一下,
回复列表 (共8个回复)
沙发
yaozheng [专家分:28410] 发布于 2011-10-15 07:58:00
++在后面意思是先运算再自增,++在前面是先自增再运算
(i++)+(++j)=6 这个过程你可以看成
i=2,j=3;
j=j+1; // ++j先自增1
k=i+j; // i先运算,所以这个等于6
i=i+1 // 运算完了后i再自增1
板凳
cgl_lgs [专家分:21040] 发布于 2011-10-15 11:48:00
惊现总管~~~~
建议楼主可以用汇编来理解执行过程:)
3 楼
fairplay [专家分:30] 发布于 2011-10-15 12:42:00
2) --j*5+(!j==!i) =11 怎么算的?
--j=2, !j=!2=0, !i=!2=0, (!j==!i)=(0==0)=1
--j*5+(!j==!i)=2*5+1=11
(3) (++i==j)*++j =4 也看不懂
(++i==j)=((++i)==j)=(3==3)=1
(4) !i++*8 =0
!i++*8=!(i++*8)
4 楼
windy0will [专家分:2300] 发布于 2011-10-15 18:25:00
2. --j*5+(!j==!i) 等价于 (--j) * 5 + ((!j) == (!i)) => 这是未定义的行为
3. (++i==j)*++j 等价于 ((++i) == j) * (++j) => 这是未定义的行为
4. !i++*8 等价于 (!(i++)) * 8
++ -- !的优先级可以理解为相同,但是它们是 右结合
* 的优先级比 ++等优先级 低
== 的优先级比 *的优先级 低
5 楼
yaozheng [专家分:28410] 发布于 2011-10-15 20:06:00
[quote]惊现总管~~~~
建议楼主可以用汇编来理解执行过程:)[/quote]
嘘,低调低调,我只是难得逮着一个我回答的出的问题。
6 楼
PLB316369813 [专家分:0] 发布于 2011-10-16 01:16:00
我还不太懂汇编是什么??不过也谢谢你了
7 楼
cgl_lgs [专家分:21040] 发布于 2011-10-17 09:52:00
汇编语言就是跟机器语言几乎是一一对应的一种语言:)
而你这几道题目无非就是:
a++和++a这样的问题:)
依稀记得,C标准中大概是这样说的:
a++如果出现在表达式中,则是使用[b]原始a值[/b],但它会在表达式结束后将a值做自增处理;
++a如果出现在表达式中,则是将a先做自增操作,然后使用[b]a自增后的值[/b]。
不过要是仅凭上面这两点,你是无法知道一些其他问题的!因为有些细节问题在标准中没有给出,而编译器则实现的非常不一样:)
所以一般情况[b]非常不建议[/b]将自增操作写到另一个表达式里。也就像楼主这样举的例子都是在实际当中不应该出现的。
楼主试想想:
int a=3;
int a=a++ + ++a;
这样a应该是多少?!!
又如果是:
int a=3;
int a=++a + a++;
这样呢?
你把上面的东东放在vc、bc、tc及gcc里跑跑看?
如何解释?
这里就会涉及到栈、表达式解析及汇编了:)
SO:楼主的问题仅适合研究,不适合应用:)
8 楼
PLB316369813 [专家分:0] 发布于 2011-10-19 01:10:00
大师! 多谢教诲! 小第不才,还请多多见谅![em1][em1][em1][em1][size=5]3[/size]
我来回复