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是真的,会返回什么?
它不是标准,但GCC扩展(可能是其他一些编译器也这样做):
5.7具有省略操作数的条件
可以省略条件表达式中的中间操作数.然后,如果第一个操作数非零,则其值为条件表达式的值.
因此,表达
Run Code Online (Sandbox Code Playgroud)x ? : y如果非零,则其值为x; 否则,y的值.
这个例子完全等同于
Run Code Online (Sandbox Code Playgroud)x ? x : y
编辑:
正如@MadPhysicist指出的那样,缩短的形式将评估x一次,而传统形式将重新评估x第二次x非零时
C标准(指C11)没有提到任何有关省略第二个操作数的内容。它指定了形式的所有三个操作数
\n\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 (exp1 ? : value2);\nRun Code Online (Sandbox Code Playgroud)\nexp1如果exp1计算结果为 TRUE ,则实际上返回。
引用在线文档gcc,
\n\n条件表达式中的中间操作数可以省略。[...]
\n因此,表达式
\nRun Code Online (Sandbox Code Playgroud)\nx ? : y\n\n
x如果该值非零,则具有 的值;否则, 的值y。
只是为了添加一些背景信息来说明为什么或何时这可能有用,
\n\n\n[...] 当第一个操作数确实或可能(如果它是宏参数)包含副作用时,它就会变得有用。然后在中间重复操作数就会产生两次副作用。省略中间操作数将使用已计算的值,而不会产生重新计算的不良影响。
\n