主题: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个回复)
21 楼
zsyhehe [专家分:0] 发布于 2006-07-29 09:49:00
首先,请楼主先检查一下“程序三”的输出结果是不是写错了?
我觉得
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 楼
shueramo [专家分:0] 发布于 2006-07-29 11:23:00
程序二: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 楼
ncys1596 [专家分:80] 发布于 2006-07-29 17:46:00
我晕,我用vc调式时列下面两个表达式,结果却不一样,上面这个是16.下面这个是15这是什么啊? 有那位大哥解释一下啊!
j=(++i)+(++i)+(++i);
j=(u=(++i)) + (f=(++i)) + (o=(++i));
24 楼
mintelong [专家分:40] 发布于 2006-08-01 00:16:00
建议楼主看看那些运算符的优先级象
区别一下i++ 和 ++i
以上问题就 迎刃而解了
上课时老师教的!~!
25 楼
68326589 [专家分:0] 发布于 2006-08-04 10:53:00
程序二 ;
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 楼
clrw [专家分:100] 发布于 2006-08-04 14:01:00
你们说的16或者18都是对的
区别就在于用的编译器不同
这个问题用TurboC得到的答案和VC得到的答案不是同的(我以前试过的)
所以应该先参考一下编译器的说明书
27 楼
xianzi687 [专家分:120] 发布于 2006-08-04 21:50:00
我同意26楼的说法
不同的编译器默认的优先级不同,所以不同的编译器运算出来的结果就不一样
我们在学校学习C语言时,一般默认的编译器都是TurboC,而学习C++时,用的是VC
28 楼
superlcr [专家分:2300] 发布于 2006-08-09 20:03:00
对此题而言,对于不同的编译器则结果也不同。因为这在C标准中没有规定,所以答案不唯一,楼主可以用多种编译器测试,你会得到不同的结果。
P.S.
个人意见,此类题无聊,没有实际意义,谁会编写这样的程序?建议楼主跳过这种题目。很多人热衷于这类产生歧异的问题,我看最好的解决办法就是程序中避开此类问题。
29 楼
huangzhe75 [专家分:0] 发布于 2006-08-09 23:00:00
你先要弄清楚:
自增自减运算符( ++ --)注意:++i和i++的不同之处,++i使用i之前先使i加1,i++使用i之后,使i加1。
30 楼
huangzhe75 [专家分:0] 发布于 2006-08-09 23:07:00
那程序二 ;
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吗?
我来回复