int n=1;printf( "%d %d %d\n ",n,n++,n--);输出为什么是1 1 1?

我是vc6.0运行结果是1,1,1 可我觉得无法理解

首先需要明白3个概念:
1.
printf函数编译的时候,表达式是从右向左计算的。输出的时候是从左向右输出的。
所以表达式的计算顺序为:n--,n++,n
输出的时候,从左向右输出"%d %d %d\n "的结果
2.
这个是比较容易忽视的:
变量是栈式存储的,所以不论n--,n++,n中的那个运算,都是对同一个栈地址中的数据进行处理,
所以任何一个处理都会影响"%d %d %d\n "的3个输出结果,
因为他们都是输出的同一个栈空间内的数据

所以:
n--:表达式结果为1,运算后n为0
n++:表达式结果为0,运算后n为1
所以最后存放n值的栈空间内的数据为1

输出结果为:1 1 1
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2018-04-12
++,--作为后缀时,是先取变量值参与到表达式运算中,等当前表达式结束后再++,--的

另外,有专家忠告,不要把带++,--的句子写在别的句子中,因为不同的编译器对这样句子会产生不同的编译结果,比如楼下这位的编译器,输出就是1 1 2.本回答被提问者和网友采纳
第2个回答  2009-08-12
这不需要理解,这和编译器有关,不同编译器的编译顺序不同,n,n++,n--。有些编译器是从左向右编译的,有些事从右向左编译的,建议写成不容易出错的形式。
第3个回答  2009-08-12
这个的输出应该是1 1 2。

int n=1;printf( "%d %d %d\\n ",n,n++,n--);输出为什么是1 1 1?
1.printf函数编译的时候,表达式是从右向左计算的。输出的时候是从左向右输出的。所以表达式的计算顺序为:n--,n++,n 输出的时候,从左向右输出"%d %d %d\\n "的结果 2.这个是比较容易忽视的:变量是栈式存储的,所以不论n--,n++,n中的那个运算,都是对同一个栈地址中的数据进行处理,所以任...

main() { int n=1; printf("%d %d %d\\n",n,++n,n--); } 为什么运行结果...
然后是++n,由于++是前置,所以先计算自增,0自增一个就是1, 然后输出1.最后输出n,n也就是1。所以是1 1 1

...main() { int n=1; printf("%d,%d,%d",n,++n,n--); }
因为在一些编译环境中,printf的执行执行顺序是颠倒的,即从右向左执行。printf("%d,%d,%d",n,++n,n--);所以n--先执行,此时n的值为0。因为后缀的自减操作是有“延迟的”,所以输出为1 ++n第二个执行,自增操作立即生效,输出为1 n第三个执行,输出为1 所以输出为1,1,1 你可以在自己的...

n=1; printf("%d%d%d\\n",n++,++n,n--);
当放在前面时(第二个++n),便是先将n加1然后输出;当放在后面时(第一、三的n++和n--),便是先输出n,然后将n加1(减1)

main() { int n=1; printf(“%d %d %
关键点:printf函数对参数的计算顺序,是从右往左的 所以,这个程序中printf执行的顺序是n--、 ++n、 n,执行逻辑如下:n=1,n--;此时printf输出1,n=0 n=0,++n;此时printf输出1,n=1 n=1;此时printf输出1 所以,这个程序结果是是1 1 1 ...

c语言若n=1,为什么n,++n,n--等于2,2,1
你这个问题没说清楚,估计是printf("%d %d %d",n,++n,n--);的输出结果吧。因为printf的参数是从右到左传递的,所以先看n--,这表示先取n的值1,在所有的值传递完了之后,进行自减1,所以在处理++n时,n=1。再看++n,这个好解释,就先增加1,再传递,所以n=2,最后处理n,所以传递的值...

执行int a=1; printf("% d,% d,% d\\ n"
执行int a=1; printf("%d, %d, %d\\n", a, ++a, a++)的结果为3,3,1。这个语句的输出结果不是唯一的,因为对于求值的顺序是不一定的,所以说还有可能输出的结果为1,2,2。当求值的顺序为自右向左是,那么a++先引用1然后再加1,会输出1,然后++a是先加1再引用,会输出3这个结果,...

main() { int i=1; printf("%d,%d\\n",i,i ); }
在printf执行完后i才会自加。printf函数参数入栈时i的值仍然为1。

int i=1,j=1,k=1; printf("%d\\n",++i||++j&&++k); printf("%d %d %d...
对于C++,||运算是,如果左边部分是1,那么右边不需要判断,直接返回1;所以对于++i||++j&&++k,++优先级高于||,首先判断++i,i=2是true,所以直接返回1,后面不需要判断了。所以输出1;而j,k值没有改变,i变成2;所以输出:2,1,1

int n=0; printf("%d %d %d\\n",++n,++n,++n);
这种情况在c语言中称作由实现定义,不必深究。因为我们根本无法知道n究竟是在什么时候自增的,我们唯一清楚的是当这条语句执行完后,n肯定会自增1。 所以你只要知道以后不要这样用就行了。

相似回答