回 帖 发 新 帖 刷新版面

主题:帮忙解释一下下面表达式的值是怎么来的

计算下列表达式的值(表达式运行前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个回复)

沙发

++在后面意思是先运算再自增,++在前面是先自增再运算
(i++)+(++j)=6   这个过程你可以看成

i=2,j=3;
j=j+1;  // ++j先自增1
k=i+j;  // i先运算,所以这个等于6
i=i+1   // 运算完了后i再自增1

板凳

惊现总管~~~~
建议楼主可以用汇编来理解执行过程:)

3 楼

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 楼

2. --j*5+(!j==!i)  等价于 (--j) * 5 + ((!j) == (!i)) => 这是未定义的行为
3. (++i==j)*++j    等价于 ((++i) == j) * (++j)       => 这是未定义的行为
4. !i++*8          等价于 (!(i++)) * 8

++ -- !的优先级可以理解为相同,但是它们是 右结合
*        的优先级比 ++等优先级 低
==      的优先级比  *的优先级 低

5 楼

[quote]惊现总管~~~~
建议楼主可以用汇编来理解执行过程:)[/quote]

嘘,低调低调,我只是难得逮着一个我回答的出的问题。

6 楼

我还不太懂汇编是什么??不过也谢谢你了

7 楼

汇编语言就是跟机器语言几乎是一一对应的一种语言:)
而你这几道题目无非就是:
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 楼

大师! 多谢教诲!  小第不才,还请多多见谅![em1][em1][em1][em1][size=5]3[/size]

我来回复

您尚未登录,请登录后再回复。点此登录或注册