表达式中的问号运算符

d0r*_*ife 14 c operators

K&R第二版(第71页) - 我一定错过了解释:

sign = (s[i] == '-') ? -1 : 1;
Run Code Online (Sandbox Code Playgroud)

这个上下文是一个将字符串转换为double的函数.这部分特别是在功能跳过空白区域之后.我推断它正在检查正值或负值,并在函数结束时将其保存为-1或+1以进行符号转换...return sign * val /power;

我想这样做不是更好推断......我是特别不确定什么?: 1正在做的事情(或任何地方,对于这个问题).

这看起来像是一个抽象的if陈述.当?检查真理,:else......是这样吗?它仅限于if/else

我是初学者,之前我没有遇到过这种表达式语法,所以我想知道是否有一个特殊的原因它似乎经常被正式的if/else替代 - 也许,可读性?

小智 15

这看起来像是一个抽象的if语句,其中?检查真相,:是否......就是这样?

是的,差不多.它被称为"条件运算符"(有时不完全准确地称为"三元运算符",因为它是C中唯一的三元运算符).这不是一个陈述,它是一个表达,它有一个价值.如果第一个参数的计算结果为true,则计算其第二个参数;如果结果为false,则计算其第三个参数.因此

sign = (s[i] == '-') ? -1 : 1;
Run Code Online (Sandbox Code Playgroud)

相当于

if (s[i] == '-') {
    sign = -1;
} else {
    sign = 1;
}
Run Code Online (Sandbox Code Playgroud)


Pub*_*bby 14

它有点像抽象if语句.

那是对的.这被称为"三元条件运算符".

正则if用于语句,而条件运算符用于表达式.


我想知道是否有一个特殊的原因它似乎经常被正式的if/else取代 - 除此之外,也许是可读性?

有些情况下,语句上的分支是不够的,您需要处理表达式级别.

例如,考虑初始化:

const int foo = bar ? 5 : 3;
Run Code Online (Sandbox Code Playgroud)

这不能使用普通if/ 写入else.


无论如何,那些说它等同于if/的人else都是不精确的.虽然生成的程序集通常是相同的,但它们不是等效的,它不应该被视为简写版本if.简单地说,if尽可能使用,并且只在需要分支表达式时使用条件运算符.