注册 登录
编程论坛 新人交流区

新人问题~~花你几分钟

mtchenjun 发布于 2007-10-15 22:28, 1351 次点击

你们好,我是一名初学者,请教两个让你们笑掉大牙的小程序.可是我很不明白这其中的原因
1.main()
{
int n=1;
printf( "%d %d %d\n" ,n ,++n, n--);
}

2.main()
{
int n=1;
printf( "%d %d %d\n" ,n ,n++, n--);
}
就我自己的思路答案应该是:(1)1,2,1. (2)1,1,1.可我用编译器如实写下程序查看结果却为:(1)1,1,1. (2)1,0,1.
由其是第二题,怎么也想不明白结果中会有0这个答案.请各位老手可以给我一个详尽的解讲.在此非常感谢.

44 回复
#2
abboter2007-10-16 00:14

1.printf从后往前执行
先执行n--(值不变),再执行++n(值变2),最后执行n
2.同样道理

#3
dz861022007-10-16 00:29
你们说的我怎么
#4
dz861022007-10-16 02:18
好像不对?
#5
杨子鹅2007-10-16 09:17
第二个再我电脑上是111啊
#6
leagn2007-10-16 09:20

。。。。。。。。
不会,来发帖的。。。
飘过。。。

#7
lypx2007-10-16 09:50
printf是从后往前执行吗?
#8
冷云逸2007-10-16 11:00
第二个在我的电脑编译器上是1 1 1 ,你们用的是什么编译器呀?
#9
冷云逸2007-10-16 11:04
我第一个编译出来是2 2 1怎么回事呀?  哪位大侠帮我一下
#10
Wǒの小小菜鸟2007-10-16 11:11
不是吧!!不符合逻辑的
#11
Wǒの小小菜鸟2007-10-16 11:14
我觉得第一个应该是1 2 1 ,第二个是1 1 1逻辑上应该是这样的
#12
IvWvI2007-10-16 11:23

我第一个是2 2 1,第2 个正常,点解?

#13
freesky1682007-10-16 11:38
大家是学C或C++的吧?好像C#没有这样的问题呀?
#14
火乍弓单2007-10-16 12:25
你的编译器有问题吧?
#15
sz100862007-10-16 12:27

努力学习中。。

#16
呜哈哈2007-10-16 12:37

我也看不懂 ,都快考C 二级 的人了 这个问题也看不了真的很寒心 。到底是编译器错了 还是LZ错 。给个明确谢谢了

#17
tdzdtdzd2007-10-16 12:40
应该是他写错拉
#18
ironfly2007-10-16 13:03

第一个编程出来的是2 2 1
第二个编程出来的是1 1 1
绝对正确!

#19
mosg2007-10-16 13:08
%d n=1
%d n=n-1+1
%d n
1,1,1

%d n=1
%d n=n-1
%d n=n+1
1,0,1
#20
monomania2007-10-16 14:13

看起来像是从后执行到前面.
对于程序一:
.main()
{
int n=1;
printf( "%d %d %d\n" ,n ,++n, n--);
}
n--时,是先做打印操作,然后再做减操作,所以打出来是原来的n,即为1,然后做减操作,变为0;
++n时,是先做加操作再做打印操作,也就是说0先加1变成1,然后打印出来,打印结果为1.
n时,既打印出n,即为1.
程序二的逻辑同上.

#21
wangchun_an2007-10-16 16:28
回复:(mtchenjun)新人问题~~花你几分钟

1.main()
{
int n=1;
printf( "%d %d %d\n" ,n ,++n, n--);
}

2.main()
{
int n=1;
printf( "%d %d %d\n" ,n ,n++, n--);
}

1.printf 是从后往前执行的,先说n--,输出n=1后,n自减1,此时n=0
再说++n,先让n自加1,使n=1,输出
最后这个n就不用说了,上一步时n=1,此时直接输出


2.此题比上题就第二步不同,在n=0后,先输出这个0,然后再给他做自加,这时n又等于1了

[此贴子已经被作者于2007-10-16 16:29:05编辑过]

#22
nghf2007-10-16 17:14
受教了,我还一直认为是从前向后执行的.寒一个
#23
sagittor2007-10-16 17:45
回复:(mtchenjun)新人问题~~花你几分钟
请检查逻辑
#24
tml00272007-10-16 17:52
回复:(mtchenjun)新人问题~~花你几分钟

我是新人,只看不说话!

#25
koman2007-10-16 21:49
以下是引用wangchun_an在2007-10-16 16:28:34的发言:

1.main()
{
int n=1;
printf( "%d %d %d\n" ,n ,++n, n--);
}

2.main()
{
int n=1;
printf( "%d %d %d\n" ,n ,n++, n--);
}

1.printf 是从后往前执行的,先说n--,输出n=1后,n自减1,此时n=0 再说++n,先让n自加1,使n=1,输出
最后这个n就不用说了,上一步时n=1,此时直接输出


2.此题比上题就第二步不同,在n=0后,先输出这个0,然后再给他做自加,这时n又等于1了 //我在vc++中测试感觉是n--,输出n就不再计算n--了 ,只有自增(减)操作符在n前面的时候才会改变n的值;可能与编译器有关的,至少vc下第一题是自后运算
n-- 直接打印n;--忽略 //1
++n 先加1再打印,n的值改变为2;//2
n 直接打印n; //2
打印结果为2 2 1;
第2题
n-- 直接打印n; //1
n++ 还是直接打印n;//1
n  继续打印n;//1
输出结果 1 1 1;
//要是是这种情况?:
void main()
{
a=1;
printf("%d,%d,%d\n",a,++a,a--);
printf("%d,%d,%d\n",a,a++,a--);
}
输出结果还是 221
111
因为printf()是一个函数,a为传的值过去,他不能改变main函数里a的值,只能改变printf();这个语句里的a的值,其实printf()里的a应该不等同于main函数里的a了,至少不应该是同一个内存地址;//我的理解是不是错误的!高手指点!


[此贴子已经被作者于2007-10-16 21:56:49编辑过]

#26
yuwei50002007-10-16 22:08
我运行是1 2 2  和  1 1 2
#27
yuwei50002007-10-16 22:21
这么解释~~~首先那个 n 输出 1

接着那个 ++n 是先 +1 , ++n 就变成 2
那个 --n 是后减 ,所以输出的还是 2
结果就是 1 2 2
后面那个一样

先是n 为 1
接着是 n++ 后加 所以还是 1
而那个n-- 就是因为前面一个已经 +1 了,而还没 -1 所以是 2
#28
w158249306722007-10-16 22:44

有的系统中,在调用函数时,实参数的求值顺序是自左而右的,而有的则是自右而左的。

上面的结果可以这样求出:
一:printf( "%d %d %d\n" ,n ,++n, n--);
先执行n--,输出n=1,之后n=0;++n先加(n=1)后取值n=1;最后:n=1;
二:printf( "%d %d %d\n" ,n ,n++, n--);
先执行n--,输出n=1,之后n=0;n++先取值n=0后加(n=1);最后:n=1;

之所以有不同的结果是因为不同的系统它的求值顺序是不同的,最好先试一下你自己机器的执行次序方便以后编程!

#29
无敌小欣2007-10-16 22:44
按19楼的理解了。..

天啊。.你们一会1一会2的.. 糊涂了 不知道该听谁的
#30
lxmhero2007-10-16 23:03
飘过。。。
#31
lxmhero2007-10-16 23:03
不知道该听谁的
#32
liweiqing2007-10-16 23:09
看你用的是什么编译器,如果的turbo c的话应该是1 1 1和1 0 1
#33
mtchenjun2007-10-16 23:15
回复:(mtchenjun)新人问题~~花你几分钟
谢谢大家,我是用的Turbo C 2.01 英文版.按三十楼的说法,我怎么测试的编译器呢?
#34
ncb1232007-10-16 23:33
30楼总结的对 ,顶一下!
#35
zxc19982007-10-17 06:56

学习,还没注意过,参数的调用顺序问题

#36
无敌小欣2007-10-17 09:37
额...明白了.. 原来编译器不同的问题呀。.
只要思路对的就行 ~
#37
lisazhoulihu2007-10-17 12:39

原来printf是从后往前执行了啊,知道了。

#38
snowcy2007-10-17 13:14
回复:(Wǒの小小菜鸟)不是吧!!不符合逻辑的
wokao
#39
snowcy2007-10-17 13:14
啥也不会,我就来了
#40
snowcy2007-10-17 13:15
真的不会啊
#41
thanatos2007-10-17 16:49
你有必要看下操作符运算 里面的递加,递减运算
++a是先+再赋值 a++是先赋值再+
#42
JackyC2007-10-17 17:42

有难度,一起学习

#43
quanercao2007-10-17 17:45
哎哟。。从后到前。。倒着执行的。。
#44
abin72302007-10-17 19:12
有些电脑是从左至右运算的,有些是从右至左的,看电脑而定吧
编程时最好不要用这种方法,移植性太差.
#45
zmzlx2007-10-18 08:57

和9楼的一样,我编译出来的也是2 2 1,和1 1 1,why?

1