В следующем фрагменте кода из более обширного фрагмента кода, представленного
void func(int* usedNum, int wher) {
*usedNum = *usedNum + 1 > wher ? ++(*usedNum) : wher + 1;
}
int main(void) {
int a = 11, b = 2;
func(&a, b);
}
предупреждение издается
warning: operation on '* usedNum' may be undefined [-Wsequence-point]
*usedNum = *usedNum + 1 > wher ? ++(*usedNum) : wher + 1;
Есть ли проблема с кодом?
Мой источник сомнений был этот и часть, где говорится
Точки последовательности в логических выражениях, таких как && и || и тернарный оператор?:, а оператор запятой означает, что операнд левой стороны оценивается перед операндом правой стороны. Эти несколько операндов являются единственными операндами в С++, которые вводят точки последовательности.
TL;DR
Для тех, кто находит пытки, чтобы читать комментарии: первоначальный вопрос не был правильно поставлен, и было бы несправедливо создавать неправильные представления. Мой взгляд на эту тему имел две стороны
-
Тернарный оператор не испортит (неожиданным образом) точки последовательности (что выполняется, две ветки секвенированы в каждой версии C, С++ - см. предоставленную ссылку)
-
Является ли
x = ++x
проблемой? Как видно из ссылки coliru, мы компилируем для С++ 14. Там операция хорошо определена (ссылки на комментарии), но более старые версии С++ и c рассматривают это как undefined. Так почему же существует предупреждение?
Ответы фокусируются как на C, так и на С++; это - хорошая ссылка. Наконец, тег C был первоначально (мой плохой) и не может быть удален, потому что существующие вышеперечисленные ответы относятся к нему