三元运算符中的所有参数都是强制性的,还是可以"(exp1?:value)"?

ann*_*obs 7 c syntax ternary-operator

我想知道在语言C的三元运算符中,所有参数都是强制性的吗?例如:

(exp1 ? : value2);
Run Code Online (Sandbox Code Playgroud)

或者你需要写:

(expr1 ? value1: value2);
Run Code Online (Sandbox Code Playgroud)

我问过,因为如果你写:(exp1 ? : value2);如果expr1真的,会返回什么?

Ser*_*rge 5

它不是标准,但GCC扩展(可能是其他一些编译器也这样做):

5.7具有省略操作数的条件

可以省略条件表达式中的中间操作数.然后,如果第一个操作数非零,则其值为条件表达式的值.

因此,表达

 x ? : y 
Run Code Online (Sandbox Code Playgroud)

如果非零,则其值为x; 否则,y的值.

这个例子完全等同于

 x ? x : y
Run Code Online (Sandbox Code Playgroud)

编辑:

正如@MadPhysicist指出的那样,缩短的形式将评估x一次,而传统形式将重新评估x第二次x非零时


Sou*_*osh 4

C标准(指C11)没有提到任何有关省略第二个操作数的内容。它指定了形式的所有三个操作数

\n
\n

条件表达式:
\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 \xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 逻辑或表达式
\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\ xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 逻辑或 表达式 ? 表达 : 条件表达式

\n
\n

您正在谈论编译器扩展。表格

\n
 (exp1 ? : value2);\n
Run Code Online (Sandbox Code Playgroud)\n

exp1如果exp1计算结果为 TRUE ,则实际上返回。

\n

引用在线文档gcc

\n
\n

条件表达式中的中间操作数可以省略。[...]

\n

因此,表达式

\n
    x ? : y\n
Run Code Online (Sandbox Code Playgroud)\n

x如果该值非零,则具有 的值;否则, 的值y

\n
\n

只是为了添加一些背景信息来说明为什么何时这可能有用,

\n
\n

[...] 当第一个操作数确实或可能(如果它是宏参数)包含副作用时,它就会变得有用。然后在中间重复操作数就会产生两次副作用。省略中间操作数将使用已计算的值,而不会产生重新计算的不良影响。

\n
\n