#include<stdio.h>
int main()
{
int x=10,y=9;
int a,b,c;
a=(x--==y++)?x--:y++;
b=x++;
c=y;
return 0;
}
容易混淆的是a=(x--==y++)?x--:y++;的运算符优先级问题。三目运算符优先级很低,所以实际执行相当于(a=(x--==y++))?x--:y++;
x--==y++相当于:
x==y
x=x-1;
y=y+1;
由于x和y不相等所以,a=(x==y)的结果是a=0,作为三目运算符的条件,为假,执行y++,因此这一行执行完后,x会减去1,y会加2,使得 x=9,y=11
b=x++是先执行b=x,然后x加1
因此最终各变量值为a=0,b=9,c=11,x=10,y=11
a=(x--==y++)?x--:y++;
因为a=0不成立,执行y++
解析:
1、先执行x==y,由于x=10,y=9,所以不成立,结果为0(假),所以a=0(假),第一个表达式不满足条件,执行第三个表达式y++
2、x--变为9,y++变为10
3、执行第三个表达式y++变为11
4、b=x++,由于是后自增,所以b为9
a=(x--==y++)?x--:y++;
(x--==y++)是后加运算和后减运算,所以先比较x==y为false,再执行x=x-1=9,y=y+1=10,
上一步比较中x==y为false,所以执行冒号后面的y++,y=11,
b=x++;++在后面所以先输出x,b=x=9,x再加一
三目运算符里 x--表达式的值是10,y++表达式的值是9;
但此时x的值是9,y的值是10;
然后执行三目运算符,x和y不相等;
则执行a = y++ = 10;y的值变为11;
b = x++,而x++的表达式的值是9,x的值成为10;即b = 9;
a = 10,b = 9,c = 11;
(已在编译器运行求证)