能力值:
( LV2,RANK:10 )
|
-
-
2 楼
实例2
++a表示先将a加1,再带入表达式运算,a++表示先将a带入表达式运算,再将a加1
b=6+7+7=20
a=8
|
能力值:
( LV5,RANK:60 )
|
-
-
3 楼
这个问题我认为没有太大的研究价值。不同的编译器有不同的做法。写代码的时候尽量不要写这些自己都看不懂的东西。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
对于实例1:
我认为应该b的值是20
第一次++a传送给函数的a=6
第二次++a传送给函数的a=7
第三次a++传送给函数的a=7
所以b=6+7+7=20
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
看来论坛很多高人啊
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
编译器不同结果也不同的,楼主可以自己调试下就可以了啊!关键是明白自增和自减运算符的功能就OK了啊!
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
感谢楼上两位兄弟的提醒,我们只是想对理论上的逻辑算法进行讨论,暂抛开编译器不讲。
这个在不同的编译器确实值不同,甚至同一个编译器编译出来的DEBUG和RELEASE值都不同.
但是从理论的角度来看究竟是怎么样计算才是正确的?
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
a=8 ,b=20
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
奇怪... 为神马没人回答21...
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
这个是编译器未定义行为,不同编译器结果不一样,这个没有研究价值,别钻牛角尖了
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
不必要围着细节追究
|
能力值:
(RANK:10 )
|
-
-
12 楼
int a=5,b;
b=(VALUE(++a))+(VALUE(++a))+(VALUE(a++));
b=?
->b=(VALUE(6)+VALUE(++a)+(VALUE(a++),此时a=6
->b=6+VALUE(7)+VALUE(a++),此时a=7
->b=6+7+VALUE(7),但此时a已经是8了。
所以结果:
b=6+7+7=20;
int a=5,b;
b=(++a)+(++a)+(a++);
b=?
->b=6+(++a)+(a++),此时a=6
->b=6+7+(a++),此时a=7
->b=6+7+7,此时a=8,但这条语句使用的a值是6
所以结果:
b=6+7+7=20
个人理解,请指教。
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
b = 20;
a = 21;
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
b=(++a)+(++a)+(a++);
00411A45 mov eax,dword ptr [a]
00411A48 add eax,1
00411A4B mov dword ptr [a],eax
00411A4E mov ecx,dword ptr [a]
00411A51 add ecx,1
00411A54 mov dword ptr [a],ecx
00411A57 mov edx,dword ptr [a]
00411A5A add edx,dword ptr [a]
00411A5D add edx,dword ptr [a]
00411A60 mov dword ptr ,edx
00411A63 mov eax,dword ptr [a]
00411A66 add eax,1
00411A69 mov dword ptr [a],eax
vs2008翻译成这个,结果b是21
|
能力值:
( LV12,RANK:360 )
|
-
-
15 楼
不知道是从左往右算还是从右往左算的,,模糊了...从右往左的话,应该是这样
第一个b=8+7+6 = 21
第二个b=7+6+5 = 18
从左往右的话,应该是
b = 6+7+8 = 21
b = 6+7+7 = 20
个人观点......
|
能力值:
( LV3,RANK:20 )
|
-
-
16 楼
第一个问题,要取决于编译器,第二个问题,同第一个问题,如3楼所说。不要把自己不确定的东西让编译器来确定
|
|
|