河之英灵 发表于 2012-3-26 22:27:40

c语言自增自减运算符问题

刚刚看了视频卡住了,在百度也没有搜到
#include <stdio.h>
void main()
{
   int a,b;
   a = 3;
   b = (++a)+(++a);
   printf("%d\n%d\n",a,b);

}
结果为什么等于5,10呢,5我明白,10就不明白了,我想的结果是9,还有
如果把b=(++a)+(++a)+(++a)结果是16,为什么啊?


河之英灵 发表于 2012-3-26 22:32:16

+++++++++++++++++++++++

Anglebaby 发表于 2012-3-27 13:49:27

b = (++a)+(++a);

这个是先算(++a)+(++a) 是4+5 ;

但是,由于4<5 计算机会把4变成5 ;

故、结果为10 。

So、你明白不 ?

河之英灵 发表于 2012-3-27 20:43:22

我会了,谢谢,但是不是你这样解释

湮汐 发表于 2012-3-28 15:16:53

在同一个句子里面不要使用这么多的自增和自减,前缀自增就是先+1后执行,后缀自增就是先执行后+1,至于判定的地方,一般是在一个表达式后面的逗号或者是分号后面执行后缀自增。但是有的地方说不清楚,不同的系统和不同的编译器都不好说。
至于本题目里面,b的值其实很不确定,我的系统用vc++6.0算出来的是10,但是有的可能是9。在同一个语句里面预算一个变量两次自增以上就不好确定值了,因为你不知道系统是从左到右运算还是从右向左运算。
楼主尽量不要用这种方法。

莫名其妙 发表于 2012-3-28 16:56:54

本帖最后由 莫名其妙 于 2012-3-28 17:05 编辑

这++-- 真 让人头痛

汇编大妈查看如下

5:       a = 3;                  这里存放a的值
00401028   mov       dword ptr ,3   这是赋值   a=3

6:       b = (++a)+(++a);
                        这里暂时存放前一个a的值
0040102F   mov       eax,dword ptr
00401032   add         eax,1                           这里将 a自增
00401035   mov         dword ptr ,eax自增后的结果给a   a=4
                         这里暂时存放后一个a的值
00401038   mov         ecx,dword ptr
0040103B   add         ecx,1                           这里后面的a 自增
0040103E   mov         dword ptr ,ecx自增结果 给后面的a = 5

               这里统一前后两个a的值 ( a的值取最后一次得出的a的值)
00401041   mov       edx,dword ptr    这里将   a 统一等于5 参与运算
00401044   add         edx,dword ptr     a+a

竹逸 发表于 2022-8-9 16:23:47

莫名其妙 发表于 2012-3-28 16:56
这++-- 真 让人头痛

汇编大妈查看如下


懂了,谢谢指点{:10_281:}
页: [1]
查看完整版本: c语言自增自减运算符问题