条件运算符的必要性在哪里?从功能上讲,它是多余的,因为它实现了一个if-else结构。如果条件运算符比等效的if-else赋值更高效,那么为什么编译器不能更有效地解释if-else?
条件运算符的必要性在哪里?从功能上讲,它是多余的,因为它实现了一个if-else结构。如果条件运算符比等效的if-else赋值更高效,那么为什么编译器不能更有效地解释if-else?
其他回答很好。但我很惊讶没有人提到它可以用来以简洁的方式帮助实施const正确性。
像这样:
const int n = (x != 0) ? 10 : 20;
基本上,n
是一个const
,其初始值取决于一个条件语句。最简单的替代方案是将n
不声明为const
,这样就可以使用普通的if
语句来初始化它了。但如果你想要它是一个const
,那么就不能用普通的if
语句实现。你可以使用像下面这样的辅助函数来替代:
int f(int x) {
if(x != 0) { return 10; } else { return 20; }
}
const int n = f(x);
但三元条件运算符版本更加简洁,可以说更易读。
三目运算符是一种语法上和可读性上的便利,而不是性能上的捷径。对于复杂度不同的条件语句,人们对它的价值观存在分歧,但对于短条件语句来说,拥有一个单行表达式很有用。
此外,由于它是一个表达式,正如Charlie Martin所写的那样,在C语言中它可以出现在语句的右侧。这对于简洁很有价值。
这对于代码混淆至关重要,比如:
Look-> See?!
No
:(
Oh, well
);
紧凑性和将if-then-else结构内联到表达式中的能力。
在C语言中,有很多东西并不是必需的,因为它们可以在其他方面更或多或少地实现。以下是一个不完整的列表:
想象一下如果没有这些内容你的代码会是什么样子,你也许就能找到答案了。三目运算符是一种"语法糖",如果谨慎使用和技巧得当,会使编写和理解代码变得更容易。
有时候,三元运算符是完成工作的最佳方式。特别是当你想要三元运算符的结果是一个l-value时。
这不是一个好的例子,但我在寻找更好的例子上一片空白。确实,并不经常真正需要使用三元运算符,尽管我仍然经常使用它。
const char* appTitle = amDebugging ? "DEBUG App 1.0" : "App v 1.0";
然而,我要警告的一件事是不要把三元运算符串在一起。它们在维护时会变成一个真正的问题:
int myVal = aIsTrue ? aVal : bIsTrue ? bVal : cIsTrue ? cVal : dVal;
编辑: 这里有一个更好的例子。你可以使用三元运算符来分配引用和const值,否则你需要编写一个函数来处理它:
int getMyValue()
{
if( myCondition )
return 42;
else
return 314;
}
const int myValue = getMyValue();
...可以变成:
const int myValue = myCondition ? 42 : 314;
哪个更好是一个有争议的问题,我选择不进行辩论。
type
array_fetch(type, array, position)
typeof type;
array_t *array;
int position;
下面是array_fetch的宏定义(请注意使用三元运算符和逗号序列运算符,以在单个表达式中执行所有子表达式并获得正确顺序的值):
#define array_fetch(type, a, i) \
(array_global_index = (i), \
(array_global_index >= (a)->num) ? array_abort((a),1) : 0,\
*((type *) ((a)->space + array_global_index * (a)->obj_size)))
既然还没有人提到这点,那么得到智能的printf
语句的唯一方法就是使用三元运算符:
printf("%d item%s", count, count > 1 ? "s\n" : "\n");
注意:当从C转移到C ++时,操作符优先级存在一些差异,可能会因此产生微妙的错误。
这是一种语法糖,也是一个方便的简写形式,用于只包含一个语句的简短 if/else 代码块。在功能上,两个结构应该执行相同。