Почему я получил операцию undefined в выражении выражения в С++? - программирование
Подтвердить что ты не робот

Почему я получил операцию undefined в выражении выражения в С++?

чтобы просто описать проблему, пожалуйста, ознакомьтесь с приведенным ниже кодом:

int main()
{
    int a=123;
    ({if (a) a=0;});
    return 0;
}

Я получил это предупреждение из [-Wsequence-point]

Line 4: warning: operation on 'a' may be undefined

моя версия g++ 4.4.5

Буду признателен, кто бы ни объяснил эту простую проблему.

btw вы могли найти мою оригинальную программу и оригинальную проблему в # 7 в this Китайский сайт (необязательно)

UPD1:

хотя для изменения кода в ({if(a) a=0; a;}) можно избежать предупреждения, но я понял, что реальной причиной проблемы может быть не The last thing in the compound statement should be an expression followed by a semicolon.

потому что документальный фильм также сказал If you use some other kind of statement last within the braces, the construct has type void, and thus effectively no value.

пример может показать это:

int main()
{
    int a=123, b;
    ({;});
    ({if (a) b=0;});
    return 0;
}

и этот код получил никаких предупреждений! поэтому я думаю, что настоящая причина - это что-то вроде точки последовательности.

Пожалуйста, помогите!

UPD2:

извините @AndyProwl за то, что он не принял его ответа, который был принят до UPD1. после его рекомендации я могу задать новый вопрос (UPD1 - новый вопрос, отличный от оригинального). Я верну его ответ снова, потому что он, конечно же, избегает предупреждений.:)

Если я решил задать новый вопрос, я обновлю этот вопрос, чтобы добавить ссылку.

4b9b3361

Ответ 1

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

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

EDIT:

Как отметил Шафик Ягмур в комментариях, это, по-видимому, расширение GNU. Согласно документации, значение этого выражения выражения должно быть значением последнего оператора в блоке, которое должно быть выражение:

Последнее в составном выражении должно быть выражением, за которым следует точка с запятой; значение этого подвыражения служит значением всей конструкции. (Если вы используете какой-либо другой оператор, последний в фигурных скобках, конструкция имеет тип void и, следовательно, фактически не имеет значения.)

Поскольку блок в вашем примере не содержит оператор выражения в качестве последнего оператора, GCC не знает, как оценить это выражение оператора (не путать с "выражением выражения" - то, что должно появиться последним в выражение оператора).

Чтобы GCC не жаловался, вы должны сделать что-то вроде:

({if (a) a=0; a;});
//            ^^

Но, честно говоря, я не понимаю, зачем кому-то понадобится эта вещь в С++.