K& R第二版(第71页) - 我一定错过了解释:
sign = (s[i] == '-') ? -1 : 1;
这是一个将字符串转换为double的函数。这部分特别是在功能跳过空白区域之后。 我推断检查正值或负值,并在函数末尾将其保存为-1或+1以进行符号转换... return sign * val /power;
我想做的比推断更好...... 我特别不确定?
和: 1
在这里做了什么(或者在任何地方,就此而言)。
这似乎是一个抽象的if
语句。 ?
检查真相的地方:
是else
......是这样的吗?是否仅限于if/else
?
我是初学者,之前我没有遇到过这种表达式语法,所以我想知道是否有一个特殊的原因它似乎经常被正式的if/else
取代 - 此外,也许,可读性?
答案 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;
}