int a=1,b=2,c=3;
--a&&b++&&c--;
++a||b--&&--c;
求a,b,c的值
a=1,b=2,c=3
c为什么不是等于2???
还有这一题,为什么运行后x,y 的值互换了?这个也没有传地址值啊
int x=1,y=2;
void swap()
{
int t;
t=x;
x=y;
y=t;
}
int main()
{
swap();
printf("x=%d",x);
printf("y=%d",y);
}
这两个语句,实际上是两个逻辑表达式。但这里没有接收逻辑表达式的值,因此逻辑表达式就是个干扰,可以将其去除。
--a && b++ && c--;
++a || b-- && --c;
抛开逻辑表达式的干扰,这两个语句运行之后,对于a,b,c来说,相当于执行了以下语句:
--a;
++a;
b++;
b--;
c--;
--c;
这样答案就很明显了。(这里没有说让得到执行某一个语句时各个变量的值,我就暂且当作运行最终结果吧)
这个问题与变量的作用域相关,虽然swap函数并没有传入参数,但是,它里面用到了 x 和 y,思考一下,没有给我数,却需要我运算,我该怎么办?这时候就需要向外层去找,main 函数中也没有声明 x 和 y,进一步再向外找。那么它操作的就是这里的全局变量 x 和 y。同样,你这里打印的 x 和 y也是一样。
你这里对于 x 和 y只有一次声明,还可能出现不同函数、嵌套的块内重复声明的情况。关于如何确定它操作的是哪里的变量,可以这么理解,C/C++ 中的代码是分块的,通常一个块用 {}
括起来,块之间可以嵌套。如果当前块没有对块内操作的变量的定义,就向逐层向外部块中寻找,块内对变量的操作往往影响(由内到外)最先找到的对变量进行声明的那个变量。
int a = n
,其中第二个的作用域就是B-C,在此作用域内对a的读取和修改都对应这个定义。