这里主要说下,在C 和 C++ 中,三目运算符的区别。
C++代码:
1 #include <iostream>
2
3 int main(int argc ,char *argv[]) {
4
5 int a = 10;
6 int b = 20;
7
8 (a < b ? a : b ) = 30;
9
10 std::cout<<"a = "<<a<<" ,b = "<<b<<std::endl;
11
12 return 0;
13
14 }
~
ok ,同样的代码,在C中:
1 #include <stdio.h>
2
3 int main(int argc,char *argv[]) {
4
5
6 int a = 10;
7 int b = 20;
8
9 (a < b ? a : b ) = 30;
10
11 printf("a = %d,b = %d \n",a,b);
12
13 return 0;
14
15 }
~
发现,编译报错了,说是赋值操作符左边需为左值。
解决之法:
*(a<b ? a:b) = 30;
三目运算符是一个表达式,表达式不可能做左值。(a<b ? a:b) = 30 是一个表达式,表达式的运算结果存在寄存器中。C返回的不是a本身而是返回变量的值,但是C++中,对三目运算符进行了功能增强,C++返回的是a本身。
充当左值的条件,这个元素要存在内存空间 。三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用 (a < b ? 1 : b) = 30。