Левый операнд запятой не имеет никакого эффекта против правого операнда запятой не имеет никакого эффекта - PullRequest
1 голос
/ 27 мая 2019

Я очень новичок в C ++ и сейчас читаю книгу, чтобы стать лучше.Читая раздел о единственном троичном операторе C ++, я поигрался с кодом и получил вопрос:

Итак, когда я делаю это:

std::cout << "Hello ", "Mars";

, я получаю предупреждение:

предупреждение: правый операнд оператора запятой не действует [-Wunused-value]

И когда я делаю это:

std::cout << (5 > 4 ? "Hello ", "Mars" : "Bye ", "World");
  1. длявторой операнд ?: Я получаю:

    предупреждение: левый операнд оператора запятой не действует [-Wunused-value]

  2. для третьего операнда ?: Я получаю:

    предупреждение: левый операнд оператора запятой не действует [-Wunused-value]

Итак, мой вопрос, почему яполучить первое предупреждение для второго операнда ?:, а второе предупреждение для третьего операнда ?:?

Ответы [ 3 ]

4 голосов
/ 27 мая 2019

Из cppreference :

В выражении запятой E1, E2 выражение E1 оценивается, его результат отбрасывается (хотя, если оно имеет тип класса, оно выиграет 'не может быть уничтожено до конца содержащего полного выражения), и его побочные эффекты завершаются до начала вычисления выражения E2 (обратите внимание, что пользовательский оператор не может гарантировать последовательность) (до C ++ 17).

Результат левого операнда отбрасывается.Однако, если вы рассмотрите operator precedence, где оператор запятой всегда последний, то

std::cout << "Hello ", "Mars";

совпадает с

(std::cout << "Hello ") , ( "Mars" ) ;

, и компиляторпытаясь быть умным.Это

std::cout << "Hello "

действительно имеет эффект, даже если вы игнорируете возвращаемое значение.Обратите внимание, что operator<< возвращает ссылку на поток, и вы обычно игнорируете это значение.Следовательно, отказ от оператора через запятую не мешает ему что-то напечатать на экране.

С другой стороны,

"Mars";

как утверждение не имеет никакого эффекта, и это то, что компилятор пытается сказать в этом случае.

3 голосов
/ 27 мая 2019

Это из-за того, как вы их используете. Если бы вы написали

"Mars", std::cout<<"Hello ";

вы получите предупреждение "левый операнд не имеет эффекта". Если бы вы присвоили свое выражение переменной

const char *msg = std::cout << "Hello ", "Mars";

вы не получите никаких предупреждений. Когда этот код выполняется, «Hello» будет отправлено на cout, а msg будет указывать на «Mars».

Для троичного оператора правый операнд оператора запятой является результатом оператора, который является значением выражения для троичного оператора. Ваш пример такой же, как если бы вы написали

std::cout << (5 > 4 ? "Mars" : "World");
0 голосов
/ 27 мая 2019

Насколько я знаю, вы не можете использовать запятые в выходных потоках, как в python. Вы должны использовать оператор потоковой передачи между ними.

Итак:

std::cout<<"Hello ", "Mars";

Теперь должно быть:

std::cout<< "Hello" << "Mars";

Попробуйте исправить это по всему коду и посмотрите, что произойдет.

...