C 语言 中的 " 三目运算符 " , 又称为 " 条件运算符 " , 相当于一个简化版本的 if else 语句 ;
三目运算符语法 :
condition ? expression1 : expression2
上面的 condition 必须是一个 返回布尔值 的表达式 , C 语言中一般是 int ;
代码示例 :
#include
int main() {
int a = 10;
int b = 20;
// 使用三目运算符获取 a 和 b 中的最大值
int max = (a > b) ? a : b;
printf("Maximum value : %d\n", max);
return 0;
}
上面是正常使用 三目运算符 进行计算 ;
C 语言中 , 表达式的结果 是 放在 寄存器 中的 , 因此 表达式 的结果 是一个具体的值 , 值 只能读取 , 不能写入 ;
上述代码中 , 三目运算符 表达式 (a > b) ? a : b
的结果是一个数字 , 不是变量 ,
因此 , C 语言 中的 三目运算符 表达式 不能作为左值使用 ;
下面的代码中 , 尝试为 三目运算符表达式 赋值 , 结果报错 ;
代码示例 :
#include
int main() {
int a = 10;
int b = 20;
// 尝试 为 三目运算符 表达式赋值
(a > b) ? a : b = 30;
return 0;
}
执行结果 :
C:\Users\octop\Desktop>gcc hello.c
hello.c: In function 'main':
hello.c:8:21: error: lvalue required as left operand of assignment
(a > b) ? a : b = 30;
^
C:\Users\octop\Desktop>
在 C++ 语言中 , 对 三目运算符表达式 进行了增强 ,
C++ 中 , 三目运算符表达式 返回的是一个 表达式 , 不是实际的值 , 而是表达式本身 ;
在 C++ 中 , 三目运算符 可以作为左值使用 , 就是为 返回的 表达式 赋值 ;
三目运算符语法 :
condition ? expression1 : expression2
上面的 condition 必须是一个 返回布尔值 的表达式 ;
注意 C 语言直接返回表达式的值 , C++ 语言返回的是表达式 , 不会求值 ;
C++ 中的 三目运算符 返回的事一个 内存空间地址 , 也就是 表达式变量 的 内存首地址指针 ;
C++ 中的 三目运算符 返回值 , 既可以作为左值 , 又可以作为右值 ;
代码示例 :
// 导入标准 io 流头文件
// 其中定义了 std 命名空间
//#include
// 导入 std 命名空间
//using namespace std;
#include
int main() {
int a = 10;
int b = 20;
// 使用三目运算符获取 a 和 b 中的最大值
// 并且为 最大值变量 再次赋值 为 30
int max = (a > b) ? a : b = 30;
printf("Maximum value : %d\n", max);
printf("a = %d , b = %d\n", a, b);
return 0;
}
执行结果 :
Maximum value : 30
a = 10 , b = 30
C 语言的 三目运算符 返回的是计算完成之后的值 , 因此 该返回值 不能作为 左值使用 , 不能被赋值 ;
C++ 语言中的 三目运算符 返回的事 变量本身 , 本质是第一个地址 , 可以被赋值 , 既可以作为左值 , 又可以作为右值使用 ;
有个特殊情况 : 如果 三目运算符 返回的是一个常量值 , 那么 C++ 中该返回值不能作为左值 , 也是会报错的 ;
一个表达式可以作为左值 , 那么该表达式必须有内存空间 , 如果让 三目运算符 返回的是 地址 , 那么在 C 语言中 , 可以使用指针为该地址赋值 , 就可以作为左值使用 ;
下面的代码中 , 令 三目运算符 返回 变量的地址 , 然后使用 指针 为该地址赋值 , 即可实现 C++ 中三目运算符的效果 , C++ 编译器 就是实现的如下操作 , 返回地址 然后为 地址赋值 ;
代码示例 :
#include
int main() {
int a = 10;
int b = 20;
// 尝试 为 三目运算符 表达式赋值
// 该行代码直接报错
//(a > b) ? a : b = 30;
// 使用三目运算符获取 a 和 b 中的最大值
// 并且为 最大值变量 再次赋值 为 30
// 令 三目运算符 返回 变量的地址
// 然后使用 指针 为该地址赋值
// 即可实现 C++ 中三目运算符的效果
// C++ 编译器 就是实现的如下操作 , 返回地址 然后为 地址赋值
int max = *((a > b) ? &a : &b) = 30;
printf("Maximum value : %d\n", max);
printf("a = %d , b = %d\n", a, b);
return 0;
}
执行结果 :
C:\Users\octop\Desktop>gcc hello.c
C:\Users\octop\Desktop>a.exe
Maximum value : 30
a = 10 , b = 30
C:\Users\octop\Desktop>