C++ 三元运算符,有什么区别吗?

9 c++ initialization conditional-operator

我正在阅读以下内容的区别:

1)

std::string test = level > 10 ? "Master" : "Beginner";
Run Code Online (Sandbox Code Playgroud)

2)

std::string test;
if (level > 10)
    test = "Master";
else
    test = "Beginner";
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,我被告知在第二种选择中,正在创建一个我不理解的临时值。

我了解到,当我们在没有初始化的情况下声明一个变量时,它会占用垃圾,因此编译器只保存一个内存位置,而不会“工作”来更改其值。

Nel*_*eal 7

从语法上讲,第一种情况与此有些等价:

constexpr const char* f(int level) {
    if (level > 10)
        return "Master";
    else
        return "Beginner";
}

std::string test = f(level);
Run Code Online (Sandbox Code Playgroud)

在这里,test立即用"Master"或初始化"Beginner"。在第二种情况下,test首先默认初始化,然后将任一值分配给它。

然而,优化后不一定是这样:编译器可以很好地在两种情况下生成完全相同的代码。

当我们声明一个没有初始化的变量时,它会占用垃圾

这仅适用于基本类型和 POD 类型,而不适用于std::string具有默认构造函数的类。查找默认初始化以获取详细信息。


son*_*yao 5

在这两种情况下都没有构造临时对象。

在第一种情况下,test复制初始化const char*直接三元运算符返回,通过的构造std::string回吐const char*

在第二情况下,test缺省初始化首先,然后从分配const char*ifelse通过的赋值运算符分支std::string。(顺便说一句:默认初始化后test不会垃圾,它将由默认构造函数初始化std::string为空字符串。)