Тернарные операторы C ++. Есть ли разница? - PullRequest
9 голосов
/ 25 мая 2020

Я читал о различиях в следующем:

1)

std::string test = level > 10 ? "Master" : "Beginner";

2)

std::string test;
if (level > 10)
    test = "Master";
else
    test = "Beginner";

И во втором случае мне сказали, что во втором варианте создается временное значение, которого я не понимаю.

Я узнал, что когда мы объявляем переменную без инициализации, она принимает мусор, поэтому компилятор просто удерживает место в памяти, а не " работа », чтобы изменить его значение.

Ответы [ 3 ]

7 голосов
/ 25 мая 2020

Синтаксически первый случай в некоторой степени эквивалентен следующему:

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

std::string test = f(level);

Здесь test немедленно инициализируется либо "Master", либо "Beginner". Во втором случае test сначала инициализируется по умолчанию, затем ему присваивается любое значение.

Однако это не обязательно верно после оптимизации: компилятор вполне может сгенерировать один и тот же код в обоих случаях.

когда мы объявляем переменную без инициализации, она принимает мусор

Это верно только для основных типов и типов POD, а не для классов вроде std::string, которые имеют значение по умолчанию -конструктор. Посмотрите default-initialization , чтобы узнать подробности.

5 голосов
/ 25 мая 2020

В обоих случаях не создаются временные объекты.

В первом случае test - это инициализируется копией из const char*, возвращенного тернарным оператором напрямую, через конструктор std::string, принимая const char*.

Во втором случае test сначала инициализируется по умолчанию , затем назначается из const char* в ветке if или else с помощью оператора присваивания std::string. (Кстати: после инициализации по умолчанию test не будет принимать мусор , он будет инициализирован конструктором по умолчанию std::string как пустая строка.)

0 голосов
/ 25 мая 2020

Нет причин не использовать первую форму, но у компилятора были бы серьезные проблемы с производительностью, если бы он не создавал тот же код для каждой из них. Сказав это, первая форма ясна и легка для понимания и может дать оптимизатору меньше работы, поэтому вы можете ее использовать. В нем четко указано намерение инициализировать переменную одним из двух заданных значений, а код, который наиболее четко выражает намерение, часто дает наилучший сгенерированный код (а также самый простой для понимания).

...