2016-06-26 5 views
-3

In GCCОператор ',' всегда возвращает второй аргумент?

#include <iostream> 
int main() { 
    if(1 == 2, true) { 
    std::cout << "right" << std::endl; 
    } else std::cout << "left" << std::endl; 
    return 0; 
} 

это выход 'право', это всегда так?


Может ли компилятор просто оптимизировать левый операнд, поскольку он не использовался?

warning: left operand of comma operator has no effect [-Wunused-value] 
    if(1 == 2, true) { 
     ~~^~~~ 

У меня есть некоторый код, как это:

if(doSomethingHereWhichAlwaysReturnsTrue, 
    doSomeOtherHereAndDependOnTheResultExecuteBodyOrNot) { 
    ..body.. - execute if 'doSomeOther' returns true 
} 

С помощью этого кода отладки только, я удивляюсь я могу использовать такую ​​конструкцию в выпуске. Я думаю нет.


Чтобы не спрашивать дважды, я также использовать иногда назначение цепочки как:

int i, j, k, l; 
i = j = k = l = 0; 

это безопасно?

Я слышал, что порядок выполнения не определен, и поэтому это неопределенное поведение. И как UB он может быть четко оптимизирован компилятором, но с использованием «-O3 -Wall -pedantic« Я не вижу никаких предупреждений с ним и ожидаемого результата, поэтому я думаю, что здесь нет.

+4

«Не спрашивать дважды» Почему бы и нет? Различные вопросы должны идти на отдельные вопросы. – MikeCAT

+0

@MikeCAT, разумная привычка к объединению запросов –

+1

два вопроса не связаны друг с другом, они заслуживают отдельных вопросов и отдельных ответов. – user463035818

ответ

2

Стандарт C++ 5.18 говорит

Пара выражений, разделенных запятой вычисляется слева направо; левое выражение является выражением discardedvalue (раздел 5) .86 Каждое вычисление значения , связанное с левым выражением , секвенируется перед каждым вычислением значения и побочным эффектом, связанным с с правильным выражением. Тип и значение результата: тип и значение правого операнда; результат имеет то же значение , что и его правый операнд, и является битовым полем, если его правый операнд является значением glvalue и битовым полем. Если значение правого операнда является временным (12.2), результатом является временное.

Так что да, в соответствии со стандартом, возвращение значения второго операнда является ожидаемым поведением.

Однако you can overload comma operator, и в этом случае он может вернуть то, что вы хотели бы.

0

не совсем. Для базового типа, такого как int double, это правильно. Хотя для нашего класса мы можем перезаписать оператор и решить, что возвращает оператор. Есть хороший пример в boost lib, функция о вставке вектора.

Смежные вопросы