ISO / IEC 9899: рабочий проект 202x (E) - 5 февраля 2020 г. C17..C2x N2479:
6.5.14 Оператор логического ИЛИ:
- Если первый операнд не равен 0, второй операнд не оценивается.
Контекст: существует один компилятор C, который выдает предупреждение condition is always true / false
для выражений, содержащих логические операторы. Например, если в выражении a || b
переменная b
равна unequal to 0
, компилятор генерирует condition is always true
(с указанием позиции b
в исходном коде).
Вопрос: Можно ли факт формирования такого предупреждения интерпретировать как нарушение 6.5.14.4
? Пожалуйста, предоставьте объяснение / аргументацию / ссылки.
Примечание: gcc / clang / cl
(настроенный с наивысшим уровнем предупреждений) не генерирует никаких предупреждений для приведенного выше примера.
UPD. MRE:
int main(void)
{
int c1 = 1, c2 = 1, r = 0;
if ( c1 || c2 ) { r = 1; }
return r;
}
$ cc x.c
x.c:4:10: warning: condition is always true
x.c:4:16: warning: condition is always true
if (x = 3)
), которое, хотя и совершенно законно, часто не соответствует замыслу программиста. - person 1201ProgramAlarm   schedule 24.11.2020int main(void) { return 1; }
- вероятно, так и будет, если будет вообще какая-то оптимизация. - person Jonathan Leffler   schedule 24.11.2020int main(void) { return 0 || x; }
, означает ли это, что он оценивает второй операнд? - person Language Lawyer   schedule 24.11.2020c1 = 1
наc1 = 0
? Кстати, какой компилятор C вы используете? - person Jabberwocky   schedule 24.11.2020