Определено ли поведение для добавления результата логической операции

Это нормально (определенное поведение), чтобы сложить результат логических операций (как они должны быть просто 0 или же 1)?

Могу ли я сделать что-то подобное, если я хочу посчитать числа больше нуля?(Или есть лучший способ?)

int a[3] = {1,-5,3};
int result  = 0;
for( int i = 0 ; i<3; i++)
{
    result += a[i]>0;
}

1 ответ

Решение

Квотирование C11, глава §6.5.8, (выделение мое)

Каждый из операторов < (меньше, чем), > (лучше чем), <= (меньше или равно) и >= (больше или равно) дает 1 если указанное отношение истинно и 0 если это неверно. 107) Результат имеет тип int ,

Затем вы выполняете сложное назначение, где требуется, чтобы

Для операторов += а также -= только левый операнд должен быть атомарным, квалифицированным или неквалифицированным указателем на полный тип объекта, а правый должен иметь целочисленный тип; или левый операнд должен иметь атомный, квалифицированный или неквалифицированный арифметический тип, а правый должен иметь арифметический тип.

и ваше выражение удовлетворяет ограничения.

Так что да, это определенное поведение.


Тем не менее, с точки зрения синтаксиса, вы в безопасности только потому, что приоритет оператора по умолчанию соответствует вашим ожиданиям. Там нет проблем как таковых, но быть явным (и, следовательно, конечно) никогда не повредит.

Вы можете переписать выражение как

 result += ( a[i] > 0 );
Другие вопросы по тегам