C中带有条件运算符的表达式的类型是什么?

假设我们有以下表达式:

(x>y) ? printf("type of int") : func_string()

那么我们这里有什么?

x>y -> true -> printf("type of int") -> the type of the expression is int (because printf function is an int type function).

或者

x>y -> false -> calls func_string() function which for the purpose of the question, returns a string.

结论是,对于这个表达式的结果,我们只有 2 个选项:一个int function (prinf)OR 一个字符串function (func_string)

这意味着表达式有 2 种可能的类型。

然而,编译器不能真正等到运行时才能获取表达式的类型,编译器不能真正编译代码,同时不确定表达式的类型是 int 还是 string,所以我们会得到一个如果我们尝试运行这种代码,则编译错误,条件运算符的 2 个结果有 2 种不同的类型。

回答

标准 C17 6.5.15 指定操作数必须按照以下方式运行:

约束

第一个操作数应为标量类型。

第二个和第三个操作数应满足以下条件之一:
— 两个操作数都具有算术类型;
——两个操作数具有相同的结构或联合类型;
——两个操作数都是空类型;
— 两个操作数都是指向兼容类型的合格或不合格版本的指针;
——一个操作数是一个指针,另一个是一个空指针常量;或者
——一个操作数是一个指向对象类型的指针,另一个是一个指向
void的限定或非限定版本的指针。


在您的示例中,(x>y) ? printf("type of int") : func_string();,printf返回类型int是算术类型。func_string()应该返回 a char*,这是一个指针类型。此用例与上面列出的任何有效场景都不匹配,因为类型不兼容。

因此编译器报告代码不是有效的 C。编译器诊断的一些示例:

国际刑事法院:

操作数类型不兼容(“int”和“char *”)

海湾合作委员会:

条件表达式中的指针/整数类型不匹配


如果第二和第三个操作数已经兼容或至少两个算术类型(一个float,一个int等),然后从6.5.15本规则适用:

如果第二个和第三个操作数都具有算术类型,则由通常算术转换确定的结果类型(如果它们应用于这两个操作数)就是结果的类型。如果两个操作数都具有结构或联合类型,则结果具有该类型。如果两个操作数都为 void 类型,则结果为 void 类型。

要理解那部分,您需要了解通常的算术转换的含义,请参阅隐式类型提升规则

最重要的是,这?:不是一些美化的if-else替代品,而是一个带有许多特殊规则的相当奇特的运算符。?:在真正的 C 代码中也很少有有效的用例,它的少数有效用途之一是某些类似函数的宏。


以上是C中带有条件运算符的表达式的类型是什么?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>