在C++中,?:运算符比if()...else语句更快吗?它们在编译后的代码中有什么区别吗?
在C++中,?:运算符比if()...else语句更快吗?它们在编译后的代码中有什么区别吗?
并不会更快。只有当你可以根据某些表达式初始化常量变量时才有一点区别:
const int x = (a<b) ? b : a;
你不能使用 if-else
来实现同样的功能。
const
变量中是不可能的。 - mtvecmax
呢?const int x = max(a,b);
完全可以正常运行。 - bobobobomax ? const int x = max(a,b);
,然后我想,哇!这是什么鬼!后来我再看一遍,发现问号并不是等宽字体!考虑到主题,我认为我有理由认为问号是命令的一部分! :) - dewdconst int x = [&] -> int { if (a < b) return b; else return a; }
。 - L. F.根据你所使用的编译器而定,但在任何现代编译器上通常没有区别。这是你不必担心的事情。要专注于代码的可维护性。
我曾见过GCC将条件运算符转换为cmov
(条件移动)指令,而将if
语句转换为分支,这意味着在我们的情况下使用条件运算符时代码更快。但那是几年前的事了,如今两者编译后很可能生成相同的代码。
不能保证它们会编译成相同的代码。如果需要性能,就像往常一样,测量。当你测量并发现:1. 你的代码太慢了;2. 这段特定的代码是罪魁祸首时,就要研究编译器生成的汇编代码,并自行检查发生了什么。
不要相信黄金法则,比如“如果我使用条件运算符,编译器总会生成更高效的代码”。
cmove
指令。 - Joey.Z它们是相同的,然而三元运算符可以用于难以使用if/else的地方:
printf("Total: %d item%s", cnt, cnt != 1 ? "s" : "");
使用if/else语句会生成非常不同的编译代码。
8年后的更新...
实际上,我认为这样做会更好:
printf(cnt == 1 ? "Total: %d item" : "Total: %d items", cnt);
(实际上,我非常确定你可以将第一个字符串中的“%d”替换为“one”)
printf("Total: %d item%s", cnt, "s" + (cnt==1));
- MSalterslpStrFilter
成员中)。 - bobobobo%s
打印源字符串中的内容,但不包括\0
。 - MSaltersprintf("Total: %d item%s", cnt, "s" + (cnt==1));
是如何工作的? - Quirk(cnt==1)
是真或假,它转换为 0 或 1。 "s" 是指向以空字符结尾的字符串的指针。加一会跳过一个字符 (即s)。这样打印出来的结果可能是 "s" 或 ""。 - MSalters<cond>?<true expr>:<false expr>
是一个表达式,而 if..else..
是一个语句。<false expr>
并对两个表达式进行类型检查。? :
在C++中相当于 if..else..
语句。只是为了稍微有些另类...
x ? y : x = value
如果x不为0(false),则将value赋值给y。
您不必把所有内容都放在一行上:
x = y==1 ?
2
:// else
3;
这种方式比if/else更清晰,因为你可以立即看到两个分支都会将x赋值。
你还可以声明一个常量,例如
int const x = y==1 ?
2
:// else
3;
而 const 可以对编译器有用,使代码更加优化。
class A{
public:
A() : value(0) {
cout << "Default ctor" << endl;
}
A(int myInt) : value(myInt)
{
cout << "Overloaded ctor" << endl;
}
A& operator=(const A& other){
cout << "= operator" << endl;
value = other.value;
}
~A(){
cout << "destroyed" << std::endl;
}
int value;
};
int main()
{
{
A a;
if(true){
a = A(5);
}else{
a = A(10);
}
}
cout << "Next test" << endl;
{
A b = true? A(5) : A(10);
}
return 0;
}
Default ctor
Overloaded ctor
= operator
destroyed
destroyed
Next test
Overloaded ctor
destroyed
A a(true ? 5 : 10);
怎么样? - Questexp1 ? exp2:exp3
其中 exp1、exp2 和 exp3 是表达式
例如
a=20;
b=25;
x=(a>b)?a:b;
in the above example x value will be assigned to b;
这可以使用if..else语句编写如下:
if (a>b)
x=a;
else
x=b;
因此,这两者之间没有区别。这是为了让程序员更容易编写,但对于编译器来说,它们是相同的。
我认为在大多数编译器和目标平台上,使用"if"语句和三目运算符"?:"都会有快慢之分。两种形式的紧凑程度也会因情况而异。哪种形式更优取决于编译器和平台。如果你正在嵌入式微控制器上编写性能关键代码,请查看每种情况下编译器生成的代码,并确定哪种更好。在“主流”PC上,由于缓存问题,唯一确定哪种更好的方法是在类似实际应用程序的环境中对两种形式进行基准测试。