表达式中的问号运算符

时间:2013-02-10 21:55:31

标签: c operators

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

sign = (s[i] == '-') ? -1 : 1;

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

我想做的比推断更好...... 我特别不确定?: 1在这里做了什么(或者在任何地方,就此而言)。

这似乎是一个抽象的if语句。 ?检查真相的地方:else ......是这样的吗?是否仅限于if/else

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

5 个答案:

答案 0 :(得分:15)

  

这似乎是一个抽象的if语句,其中?检查真相而:是其他......是这样的吗?

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

sign = (s[i] == '-') ? -1 : 1;

相当于

if (s[i] == '-') {
    sign = -1;
} else {
    sign = 1;
}

答案 1 :(得分:13)

  

这似乎是一个抽象的if语句。

这是对的。这被称为“三元条件运算符”。

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


  

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

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

例如,考虑初始化:

const int foo = bar ? 5 : 3;

无法使用普通if / else编写此内容。


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

答案 2 :(得分:3)

这是三元运营商。 (s[i] == '-') ? -1 : 1;如果-1则返回s[i] == '-',否则返回1。然后将此值分配给sign。换句话说,更长的方式是:

int sign;

if(s[i] == '-')
{
  sign = -1;
}
else
{
  sign = 1;
}

答案 3 :(得分:2)

?:是C中的条件运算符

在您的示例中,它将产生与此if语句相同的结果:

if (s[i] == '-')
{
    sign = -1;
}
else
{
    sign = 1;
}

答案 4 :(得分:0)

sign = (s[i] == '-') ? -1 : 1;

是:

的简写
if (s[i] == '-')
{
    sign = -1;
}
else
{
    sign = 1;
}