在C语言编辑器中
int main()
{
int a = 10;
int b = 20;
(a < b ? a : b) = 30;
printf("a = %d,b = %d\n", a, b);
return 0;
}
上述代码编译不通过
而在c++编译器中相同的代码,却编译的了
int main()
{
int a = 10;
int b = 20;
(a < b ? a : b) = 30;
printf("a = %d,b = %d\n", a, b);
system("pause");
return 0;
}
面对俩个不同的结果,这是不是让人很疑惑呢?
现在,让我们回到三目运算符的定义
三目运算符的定义 三目运算符:计算机C/C++的重要组成部分。
条件运算符是唯一有3个操作数的运算符,所以有时又称为三元运算符。
三目运算符:是软件编程中的一个固定格式为?: 。
三目运算符:一定要用于赋值语句。
三目运算表达式:<表达式1>?<表达式2>:<表达式3>
注:”?”运算符的含义是: 先求表达式1的值,如果为真,则执行表达式2,并返回表达式2的结果 ; 如果表达式1的值为假,则执行表达式3 ,并返回表达式3的结果。
int a=1, b=2, z;
z = (a>b) ? a : b;//条件成立赋左值z=a,条件不成立赋右值z=b
最后结果是:z=2
三目运算符是一个表达式,表达式不可能做左值
在c语言编译器中
(a < b ? a : b) = 30;
传递回来的是一个值,如 “10=20“,这显然不可以
而在c++编译器中,
(a < b ? a : b) = 30;
(a < b ? a : b)传递回来的是一个变量,编译器中为这个变量开辟了一块新的内存空间,开辟一块内存空间后,我们将这个值赋给内存空间。刚好就可以编译通过。
回顾一个知识点:
变量名是定义内存空间的别名
而如果我们在C语言中写的是以下代码
int main()
{
int a = 10;
int b = 20;
*(a < b ? &a : &b) = 30;
printf("a = %d,b = %d\n", a, b);
return 0;
}
编译通过,而且输出的是 a=30,b=20
他通过对比大小后来决定取a还是b的地址,通过指针来改变该地址中存取的值
在此次中,主要是c++编译器帮我们程序员实现了取地址的工作,其三目运算符在c++编译器中开辟了一块新的内存空间,使我们来改变最后的数值得到了可能
在C语言中,表达式的返回值是变量的值
而c++中,表达式返回的是变量的本身