Почему я получил операцию 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 - новый вопрос, отличный от оригинального). Я верну его ответ снова, потому что он, конечно же, избегает предупреждений.:)
Если я решил задать новый вопрос, я обновлю этот вопрос, чтобы добавить ссылку.
Ответы
Ответ 1
В соответствии с грамматикой С++ выражения (помимо, возможно, лямбда-выражений, но которые отличаются друг от друга) не могут содержать операторов, включая операторы блоков. Поэтому я бы сказал, что ваш код плохо сформирован, и если GCC его компилирует, это означает, что это (странное) расширение компилятора.
Вам следует проконсультироваться с ссылкой на компилятор, чтобы выяснить, какая семантика ему дана (или не указана, как подсказывает сообщение об ошибке).
EDIT:
Как отметил Шафик Ягмур в комментариях, это, по-видимому, расширение GNU. Согласно документации, значение этого выражения выражения должно быть значением последнего оператора в блоке, которое должно быть выражение:
Последнее в составном выражении должно быть выражением, за которым следует точка с запятой; значение этого подвыражения служит значением всей конструкции. (Если вы используете какой-либо другой оператор, последний в фигурных скобках, конструкция имеет тип void и, следовательно, фактически не имеет значения.)
Поскольку блок в вашем примере не содержит оператор выражения в качестве последнего оператора, GCC не знает, как оценить это выражение оператора (не путать с "выражением выражения" - то, что должно появиться последним в выражение оператора).
Чтобы GCC не жаловался, вы должны сделать что-то вроде:
({if (a) a=0; a;});
// ^^
Но, честно говоря, я не понимаю, зачем кому-то понадобится эта вещь в С++.