能否用普通if else语句直接将结果赋值给变量?
用普通if-else实现类似三元运算符的赋值操作
好问题!你之前尝试的写法之所以编译失败,核心原因是:在C++中,if-else是语句(statement),它本身不会返回任何值,因此不能直接放在赋值运算符的右侧作为赋值的数据源。而三元运算符condition ? expr1 : expr2是表达式(expression),会返回expr1或expr2的计算结果,所以可以直接用来给变量赋值。
不过我们完全可以用if-else实现和你之前代码等价的逻辑,下面分两种场景给出实现方式:
场景1:基础的条件赋值(对应你的第一个例子)
你原来的三元运算符代码:
double y = 140; int i = (y > 100)? y / 2 : y * 2; std::cout << i << std::endl; // 输出70
用if-else实现的话,只需要先声明变量,再在分支中完成赋值:
double y = 140; int i; // 先声明变量,不初始化 if (y > 100) { i = y / 2; } else { i = y * 2; } std::cout << i << std::endl; // 同样输出70
场景2:带逗号表达式的条件赋值(对应你的第二个例子)
你原来的逗号表达式代码:
double y = 140; int i = (y > 100)? (y /= 2, 5) : (y *= 2, 10); std::cout << i << std::endl; // 输出5 std::cout << y << std::endl; // 输出70
这里逗号表达式的作用是先执行前面的操作(修改y的值),再返回后面的值作为三元运算符的结果。用if-else实现的话,只需要把这两个步骤拆分到分支里:
double y = 140; int i; if (y > 100) { y /= 2; // 先执行y的修改操作 i = 5; // 再给i赋值 } else { y *= 2; i = 10; } std::cout << i << std::endl; // 输出5 std::cout << y << std::endl; // 输出70
进阶:更紧凑的if-else赋值方式(C++17及以上)
如果你想让代码更接近三元运算符的紧凑感,可以用lambda表达式立即调用的方式,把if-else逻辑包装成一个返回值的表达式:
double y = 140; int i = [&y]() -> int { if (y > 100) { return y / 2; } else { return y * 2; } }(); // 末尾的()表示立即执行这个lambda std::cout << i << std::endl; // 输出70
这种写法本质上还是用if-else处理逻辑,但通过lambda把语句转换成了能返回值的表达式,从而可以直接赋值给变量。
内容的提问来源于stack exchange,提问作者Morchul
相关产品推荐
相关产品推荐

