三元运算符编译

Ternary operator compilation

本文关键字:运算符 编译 三元      更新时间:2023-10-16

为什么这会在粗体行给出编译问题?

#include<iostream>
static int i = 10; 
int main() {
  **(i) ? (std::cout << "First i = " << i << std::endl) : ( i = 10);**
  std::cout << "Second i = " << i << std::endl;
}

编译消息:

test.c:8: error: invalid conversion from ‘void*’ to ‘int’

你对三元运算符的用法有点奇怪:根据 i 的值,你要么打印一些东西来std::cout,要么给它分配一个新值。这些操作不会通过表达式的返回值共享连接,因此不要这样做。使用三元运算符时,最好更接近其预期目的:两个可能表达式的简短表示法,带有基于简单谓词的调度。例:

const int n = i == 0 ? 42 : 43;

您的代码应如下所示:

if (i == 0)
   i = 10;
else
   std::cout << "First i = " << i << "n";

原始代码段未编译的原因是三元运算符没有通用的返回类型。"Common"表示两个表达式都可以转换为返回类型。例如,在const int n = i == 0 ? 42 : 43;中,返回类型为 int

问题来自以下事实:条件运算符(三元运算符)中表达式的返回值(在std::cout ...的情况下std::ofstreami = 10情况下int)不兼容,因此条件运算符格式不正确。请检查条件运算符的返回类型的规则。

在这种情况下,只需使用普通条件:

if (i)
  std::cout << "First i = " << i << std::endl;
else
  i = 10;