#include "stdio.h"
void main()
{
int x=4,y;
y=(--x)+(x++);
printf{"%d,%d\n",x,y);
}
想了解下这个程序的流程,是从右边开始算?
先算括号的?就是(X++)
在算(--x)? 值就是3,
3+4=7
Y=7
但是从左边算
(--x) 3
3+3=6
y=6
是怎么算的的?
从左到右?
括号里的是先算出来?再一起加?还是算出一个再赋值算??
#include "stdio.h"
void main()
{
int x=4,y;
y=(--x)+(x++);
printf{"%d,%d\n",x,y);
}
想了解下这个程序的流程,是从右边开始算?
先算括号的?就是(X++)
在算(--x)? 值就是3,
3+4=7
Y=7
但是从左边算
(--x) 3
3+3=6
y=6
是怎么算的的?
从左到右?
括号里的是先算出来?再一起加?还是算出一个再赋值算??
呵呵,答案肯定是6啊,怎么理解呢?-老师说自加自减得结合性是自右至左啊,没错,为什么?因为无论什么运算,都要通过进栈来运算,栈具有后进先出的特点,最后存放的要最先拿出来。但是无论哪个编译器,TC,VC,后加都是在语句或表达式执行完后(即遇分号后再进行),而对于前加,在TC中,它是先运算后,再进栈,即将前加都运算后,再将表达式依次进栈。在VC中,它是先进栈,出栈后再运算,如此以在tc中分析,y=(--x)+(x++);
进行+运算前它是先对--x进行运算,此时x=3,后进栈运算,得y=3+3=6,最后进行自加即x++,这样得出结果是x=4。
举1个例子自己研究就可以体会到啦:
int b=5;
a=(b)+(++b)+(b)+(++b)+(b);
tc结果是35,vc结果是32,呵呵,最好和老师一起好好探讨,以便得到深入认识!
这道题目是考察优先级得问题
至于是先从左算还是先从右算 和编译器有关 一般都是从左开始的
——X 和x++得区别在于 自增自检在左边就先算左边的
于是此时 --x 先算 即x = --x = 3, 此时 x++也是3 。
下面就是问题的关键了 y = (--x) + (x++); --x = 3,x++ = 3,在就是根据优先级 而且X++ 在X后面 于是导致X++自增在y = (--x) + (x++)执行后才执行; 于是 y = 3 + 3 = 6,然后在执行 x++ 得x等于4
就拿“++”来说吧:
++在前面的是先+后算
++在后面的是先算后+
这个问题最开始我也弄不明白的。不过,慢慢的用心的体会就会明白了。我记得我们老师是这么说的:加(减)在前面,就先加后用;加(减)在后面,就先用后加。
那下面我就拿你的那道题目来说明这句话的意思。
#include "stdio.h"
void main()
{
int x=4,y;
y=(--x)+(x++);
printf{"%d,%d\n",x,y);
}
自加自减的同级结合性是,自右向左的,也就是先从右边算起
y=(--x)+(x++);
要先算表达式(x++)的值,我们知道x=4,那么(x++)=4,x=5 【加(减)在后面,就先用后加】;
接着再算表达式(--x)的值,同样的我们知道x=4, 那么(--x)=3 x=3 【加(减)在前面,就先加(减)后用】;
所以,y=(--x)+(x++)的值是 7