#include
int main()
{
int a = 1;
int b = 2;
(a < b? a : b) = 3;
printf("a = %d,b = %d\n",a,b);
return 0;
}
上面这个程序,用C语言的编译器编译会报错,因为在C语言中,三木运算符返回的是变量的值,是一个值,不是变量,而一个值不能作为左值被另一个值赋值,所以会报错
(a < b? a : b) = 3;
—> 1 = 3 返回的是一个值 —> 一个值不能被当做左值赋值
但是上面这个程序用C++的编译器编译,就没有问题,运行之后的结果是 a=3,b=2
,这表明三目运算符在C++中,是可以作为左值使用的,因为在C++中,三木运算符返回的不是一个值,而是那个值对应的变量的引用,通过引用改变变量的值,当然是没有问题的。
(a < b? a : b) = 3;
—> int &ret = a; ret = 3; 返回的是一个引用 —> 引用当然是可以被作为左值被赋值的
当然,上面C++这样用,首先得让三木运算符试图去返回一个变量,其次才能引用这个变量的值,如果将上面的程序改成下面这样,C++编译器也是通不过的。
原来的—>(a < b? a : b) = 3; —>试图返回一个变量—>实际上返回的是那个变量的引用—>可以被当做左值
改动一下—>(a < b? 3 : 5) = 3; —>试图返回一个值—>一个值当然不能作为左值被赋值
在C语言中,不管怎么写,都不能作为左值
在C语言中,三目运算符不能作为左值使用,只能作为右值使用,因为其运算后返回的是变量的值
在C++中,三目运算符既能作为左值使用,也能作为右值使用。但是当作为左值使用的时候,三目运算符可能返回的必须是变量而不能是常量,因为一个值不能赋给常量。