回 帖 发 新 帖 刷新版面

主题: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个回复)

41 楼

第二题正解18.....请用编译器调试一下就知道了!!其实有的朋友已经说对了。。++i有较高的运算优先权,先自加再运算,第一个++i=3+1=4...此时i=4,后面还有自加运算,所以继续自加,第二个自加:++i=4+1=5....此时i=5。第三个自加:++i=5+1=6。。。最后i=6;自加完毕开始运算j=i+i+i=6+6+6=18
++i 先自加后运算。
i++ 先运算后自加。

这是我个人理解,有错误的地方欢迎大家指出!!!

42 楼

个人认为16楼!在VC中编的程序第2道已经改变了原程序的思想咯。。。请用WIN-TC之类编译器进行编译。。j=(++i)+(++i)+(++i)这句我觉得表达有欠缺哦!哈哈

43 楼

[quote]那程序二 ;
main()
{
     intj,i=3; 
     
     j=(++i)+(++i)+(++i);
     printf("%d",j); 
}
我试过拉~~用VC++调试。应该得16``楼主是不是你搞错拉[/quote]
就是18因为多个自加(自减)是共同引用,用最后一个取值
得i=6   
 j = 6+6+6

44 楼

狂晕~  绝对是12!18和16都错

45 楼

好象是啊~ 我也是一新人啊~~

46 楼

main()
{
     int j,i=3;
     j=(i++)+(i++)+(i++);
     printf("%d",j);
} 这个是把i直接运算在赋值给j也就是3+3+3=9,到最后一步都没不要自增。但是i的值已经是6了。
main()
{
     intj,i=3;
     j=(++i)+(++i)+(++i);
     printf("%d",j); }这道题中前两步中i只是赋值给下一步但是不是赋值给j到最后一步++i中i的值已经是6了,++i是先赋值在运算就是三个6相加所以是18
自增自减运算比较难掌握很容易混淆,通过大量做题你就会慢慢明白道理的,
我个人经验就是在自增或减运算中只要取最后一个i的值在相加就行了++i就是先赋值后在加如果是i++不要管直接代i的初始值相加。
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--=102
     --a=100
步骤是a++先输出a++=100,但是a=100+1=101在赋值给下个表达式
++a=101+1先加1在输出++a=102,a=102,在赋给下个
a--先输出a--=102,a=102-1=101,在赋个下个表达式
--a先减在输出--a=101-1=100。
我学C语言也才三天不知道解释好不好但是我的运算思路绝对没错,请高手指点
     



47 楼


首先我觉得这个问题没什么意义!
不同的编译器会有不同的结果!!!

j=(i++)+(i++)+(i++)  先把i=3代入式中进行加法3+3+3=9,最后i值变为6!
j=(++i)+(++i)+(++i)  
++i是实体可以做为左值而i++不能作左值!
i先变为6,然后6+6+6=18
其实这在c++里面运算的副作用,因为电脑是机械化的,他在他所在环境下对代码的认识已经定形了!所以不同环境就会有不同结果!

个人认识而已!有错还望高手指教!

出个还搞人的题目哈!
int main()
{
  int i=3;
  printf("%d\n",(--i));
  i=3;
  printf("%d\n",(--i));

  i=3;
  printf("%d\n",(i++)+(--i));
  i=3;
  printf("%d,%d\n",(i++),(--i));

  i=3;
  printf("%d\n",(i++)+(i++)+(--i));
  i=3;
  printf("%d,%d,%d\n",(i++),(i++),(--i));

  i=3;
  printf("%d\n",(i++)+(i++)+(i++)+(--i));
  i=3;
  printf("%d,%d,%d,%d\n",(i++),(i++),(i++),(--i));

  return 0;
}

48 楼


偶也是新手,发表下建议。
因为i变量只有一个内存地址。
i++ +i++ +i++时,i要先返回值在+1,表达式结束之前,i值不变,所以j=3+3+3=9。
++i+ ++i+ ++i时,先要给i+1,=表达式返回是i是6,所以j=6+6+6=18;
那个=16的是vc内部的优化,个人觉得,vc不是很好支持c/c++标准。

49 楼

++a的计算处理过程是:
变量a的值加1,再存到a中;
取a的值作为表达式的值.

a++计算处理过程是:
取变量a的值作为表达式的值;
a的值加1,再存到a中.

50 楼

a++的意思就a=a+1,其他依次类推

我来回复

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