LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4129|回复: 29

请教一道编程题?

[复制链接]
发表于 2004-12-2 20:25:54 | 显示全部楼层 |阅读模式
int a=5,k;
k=(a++)+(++a)+(a++);
为什么最后k=18,a=8
 楼主| 发表于 2004-12-2 23:19:11 | 显示全部楼层
我也不想呀,考试就考这个我也没有办法,在tc,vc上结果都是k=18,a=8,
#include<stdio.h>
main()
{
int a=5,k;
k=(a++)+(++a)+(a++);
printf("%d%d",k,a);
}
发表于 2004-12-3 00:13:32 | 显示全部楼层

回复: 请教一道编程题?

最初由 sfiloveyou 发表

  1.         int a=5,k;
  2.         k=(a++)+(++a)+(a++);
复制代码

为什么最后k=18,a=8


是这样的:
  • 在函数调用中从右到左计算参数;
  • 在表达式中所有参数一起计算;

如:

  1.         k=(a++)+(++a)+(a++);
复制代码

式中有 (++a) 为表达式前计算,此时 a=6,两个 (a++) 为表达式后计算,此时计算 k=6+6+6=18,再做两个 (a++) 后 a=8。
发表于 2004-12-3 00:28:49 | 显示全部楼层
楼上似乎说的不对~
看看我下面的实验
[PHP]Shadow root # cat >aa.c
main()
{
int a=5,k;
k=(++a)+(++a)+(++a);
printf("k=%d,a=%d\n",k,a);
}
Shadow root # gcc -o aa aa.c
Shadow root # ./aa
k=22,a=8
[/PHP]
按照楼上说的,我的结果应该等于24了,可是......
似乎是前两个(++a)先结合,7+7,再与第三个(++a)结合,7+7+8
而(a++)是在表达式后运算,但是在遇到(++a)时要使用(a++)的结果
发表于 2004-12-3 00:30:38 | 显示全部楼层
[PHP]Shadow root # cat aa.c
main()
{
int a=5,k;
k=(++a)+(++a)+(++a)+(++a);
printf("k=%d,a=%d\n",k,a);
}
Shadow root # ./aa
k=31,a=9[/PHP]
7+7+8+9
发表于 2004-12-3 00:36:29 | 显示全部楼层
而且是从左往右计算参数
赋值语句倒是从右往左[PHP]Shadow root # cat aa.c
main()
{
int a=5,k;
k=(a++)+(++a)+(++a)+(++a);
printf("k=%d,a=%d\n",k,a);
}
Shadow root # ./aa
k=27,a=9
[/PHP]
发表于 2004-12-3 01:13:48 | 显示全部楼层
......:confused: :confused: :confused: :confused: :confused:
发现一个问题,tc和GCC不一样......
恐怕是win下的C编辑器都和Linux下的不同:mad: :mad: :mad:
发表于 2004-12-3 01:17:58 | 显示全部楼层
gcc -S file.c 生成一个汇编源文件,待回了去看。
发表于 2004-12-3 01:20:15 | 显示全部楼层
似乎是两种系统的底层的差别
发表于 2004-12-3 01:21:26 | 显示全部楼层
这样的问题我上次发过的,,在不同的编译器上结果不同。在 TC 上的结果比较符合老教材的讲解。我还没试过,但我想在TC上的结果应该是k=19, a=8吧。
k=5+7+7
(不一定对)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表