15

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

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

this 的上下文是将字符串转换为双精度的函数。这部分特别是在函数跳过空格之后。我推断它正在检查正值或负值,并将其保存为 -1 或 +1 以在函数末尾进行符号转换......return sign * val /power;

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

这似乎是一个抽象的if陈述。在哪里?检查真相,:else……是这样吗?是否仅限于if/else

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

4

5 回答 5

19

这有点像一个抽象的 if 语句,在哪里?检查真假,:是不是……是这样吗?

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

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

相当于

if (s[i] == '-') {
    sign = -1;
} else {
    sign = 1;
}
于 2013-02-10T21:59:11.650 回答
18

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

这是正确的。这称为“三元条件运算符”。

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


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

在某些情况下,仅在语句上进行分支是不够的,您需要在表达式级别上工作。

例如,考虑初始化:

const int foo = bar ? 5 : 3;

这不能用普通的if/来写else


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

于 2013-02-10T22:02:53.543 回答
3

这是三元运算符。如果和否则(s[i] == '-') ? -1 : 1;返回。然后将该值分配给。换句话说,更长的写法是:-1s[i] == '-'1sign

int sign;

if(s[i] == '-')
{
  sign = -1;
}
else
{
  sign = 1;
}
于 2013-02-10T21:57:31.933 回答
2

?:是C中的条件运算符。

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

if (s[i] == '-')
{
    sign = -1;
}
else
{
    sign = 1;
}
于 2013-02-10T21:57:48.247 回答
0
sign = (s[i] == '-') ? -1 : 1;

是以下的简写:

if (s[i] == '-')
{
    sign = -1;
}
else
{
    sign = 1;
}
于 2013-02-10T21:57:47.773 回答