主题:C语言高手进下~~赋值语句 我有点不懂的地方
skyruyi
[专家分:0] 发布于 2006-07-26 11:23:00
昨天 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 楼
小林学子 [专家分:30] 发布于 2006-11-03 22:50:00
第二题正解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 楼
小林学子 [专家分:30] 发布于 2006-11-03 23:02:00
个人认为16楼!在VC中编的程序第2道已经改变了原程序的思想咯。。。请用WIN-TC之类编译器进行编译。。j=(++i)+(++i)+(++i)这句我觉得表达有欠缺哦!哈哈
43 楼
xzwhuang [专家分:230] 发布于 2006-11-04 18:34:00
[quote]那程序二 ;
main()
{
intj,i=3;
j=(++i)+(++i)+(++i);
printf("%d",j);
}
我试过拉~~用VC++调试。应该得16``楼主是不是你搞错拉[/quote]
就是18因为多个自加(自减)是共同引用,用最后一个取值
得i=6
j = 6+6+6
44 楼
lizhi8752 [专家分:0] 发布于 2006-11-10 17:18:00
狂晕~ 绝对是12!18和16都错
45 楼
apponell [专家分:0] 发布于 2006-12-11 17:11:00
好象是啊~ 我也是一新人啊~~
46 楼
lovetangxuan [专家分:0] 发布于 2007-04-12 12:50:00
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 楼
wubiao [专家分:70] 发布于 2007-04-12 13:19:00
首先我觉得这个问题没什么意义!
不同的编译器会有不同的结果!!!
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 楼
233355750 [专家分:60] 发布于 2007-04-13 18:32:00
偶也是新手,发表下建议。
因为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 楼
0杏紫悻0 [专家分:0] 发布于 2007-04-14 11:03:00
++a的计算处理过程是:
变量a的值加1,再存到a中;
取a的值作为表达式的值.
a++计算处理过程是:
取变量a的值作为表达式的值;
a的值加1,再存到a中.
50 楼
vivaman [专家分:0] 发布于 2007-04-16 21:47:00
a++的意思就a=a+1,其他依次类推
我来回复