回 帖 发 新 帖 刷新版面

主题:C语言高手进下~~赋值语句 我有点不懂的地方

昨天 C语言我学到了  赋值语句  后来我看到 自增自减运算符    有一个例题我看不懂   我不知道他为什么算出来不是12   而是9   你帮我 看看哈  最好可以把它的运算步奏 写给我 ~~~谢谢 你了

程序一;
main()
{
     int j,i=3;
     j=(i++)+(i++)+(i++);
     printf("%d",j);
}   结果为什么是9   



程序二 ;
main()
{
     intj,i=3;
     j=(++i)+(++i)+(++i);
     printf("%d",j); 
结果是18  我怎么算  也不是18 啊 迷糊


程序三

main()
{
     int a=100;
     printf("a++=%d\n",a++);  这些什么意思啊
     printf("++a=%d\n",++a);  我看每个程序都有
     printf("a--=%d\n",a--);   这些东西 但每个
     printf("--a=%d\n",--a);   意思都不一样,
     输出结果              我用什么方法一看就    
     a++=100              知道这些是什么意思
     ++a=102              呢???
     a--=100
     --a=102

为什么会是这个结果啊 我不懂什么, 意思

以上的问题 希望 你帮我 看看

在告诉我为什么哈 谢谢你 哟 [em10][em10][em10][em10][em10]

回复列表 (共60个回复)

21 楼


首先,请楼主先检查一下“程序三”的输出结果是不是写错了?
我觉得 
       a--=102;
       --a=100;
和前两个程序差不多,a的初值为100,a++就是把a+1,说点我的心得:只要是“++”在“a”的后面,就得a经过此次运算前的值,“++”在“a”的前面,就是把a经过此次运算前的值 +1 .--也是同理。
    比如这个程序,开始a=100,经过 
           printf("a++=%d",a++);
    可以把它写成两句:
           b=a++;  // b的值应该是经过a++这次运算前的a的值,即b=100.
           printf("b=%d",b);                       
    同理,printf("++a=%d",++a); 也写成两句:
          
          c=++a;  //因为这是接上一句程序的,经过“b=a++”时,a已经+1
                    即已经有a=101;再经过这个时,c应该取a 经过c=++a这次
                    运算后的结果,即c=102;
          printf("c=%d",c);
    同理,接下来的是 a-- ,所以它应该仍是102 不变。
           --a 就应该是100。

22 楼

程序二:main()
{
     intj,i=3;
     j=(++i)+(++i)+(++i);
     printf("%d",j); 
}
j=(++i)+(++i)+(++i);它实际等价于:
“i=i+1;i=i+1;i=i+1;j=i+i+i;”当执行前三个语句后i已经变成6了,所以后面的j就等于18了

23 楼

我晕,我用vc调式时列下面两个表达式,结果却不一样,上面这个是16.下面这个是15这是什么啊? 有那位大哥解释一下啊!
    j=(++i)+(++i)+(++i);
    j=(u=(++i)) + (f=(++i)) + (o=(++i));

24 楼

建议楼主看看那些运算符的优先级象 
区别一下i++ 和 ++i
以上问题就 迎刃而解了
上课时老师教的!~!

25 楼

程序二 ;
main()
{
     intj,i=3;
     j=(++i)+(++i)+(++i);
     printf("%d",j); 
结果是18  我怎么算  也不是18 啊 迷糊


会不会是这样理解,j=i+i+i这里的i可能指的是最后一位i(也就是值为6的i)所以得出j=6+6+6?

26 楼

你们说的16或者18都是对的
区别就在于用的编译器不同
这个问题用TurboC得到的答案和VC得到的答案不是同的(我以前试过的)
所以应该先参考一下编译器的说明书

27 楼

我同意26楼的说法
不同的编译器默认的优先级不同,所以不同的编译器运算出来的结果就不一样
我们在学校学习C语言时,一般默认的编译器都是TurboC,而学习C++时,用的是VC 

28 楼

对此题而言,对于不同的编译器则结果也不同。因为这在C标准中没有规定,所以答案不唯一,楼主可以用多种编译器测试,你会得到不同的结果。

P.S.

个人意见,此类题无聊,没有实际意义,谁会编写这样的程序?建议楼主跳过这种题目。很多人热衷于这类产生歧异的问题,我看最好的解决办法就是程序中避开此类问题。

29 楼

你先要弄清楚:
自增自减运算符( ++ --)注意:++i和i++的不同之处,++i使用i之前先使i加1,i++使用i之后,使i加1。

30 楼

那程序二 ;
main()
{
     intj,i=3;
     j=(++i)+(++i)+(++i);
     printf("%d",j); 
结果是18  我怎么算  也不是18 啊 迷糊

C语言的自增、自减运算符是右结合性,所以是先算最后一个表达式++i等于4;
在算第2个++i,就是4+1=5;5在自增1就是6。i的最后值为6,在求结果就是3个6相加
不是正好得18吗?

我来回复

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