Оператор сравнения для оператора - PullRequest
0 голосов
/ 31 мая 2018

У меня есть глобальная переменная с именем end_jump, которая равна 3 или 7.
В зависимости от значения, я хочу завершить цикл for (оптимизированный).
Мой текущий код:

int i;
for(i = 0; i < ((end_jump % 3) == 0) ? 4 : 10; i++){  
    /* do something with */ array[i];  
}  

Я не получаю никакого сообщения об ошибке, и цикл for продолжается, но не останавливается.Ни в 4, ни в 10.

В чем проблема?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

См. GCC Предупреждение компилятора:

warning: ?: using integer constants in boolean context, the expression will always evaluate to 'true' [-Wint-in-bool-context]
 for(i = 0; i < ((end_jump % 3) == 0) ? 4 : 10; i++){
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
0 голосов
/ 31 мая 2018

У вас есть приоритет оператора .

Релатриональные операторы имеют высокий приоритет над троичным (условным), следовательно, ваше условие цикла обрабатывается как

 for(i = 0; (i < ((end_jump % 3) == 0)) ? 4 : 10; i++)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^

, где результат тройного равен либо 4, либо * 1009.* оба они являются «правдивыми», вызывая бесконечный цикл.

Вам нужна дополнительная пара скобок.

for(i = 0; i < (((end_jump % 3) == 0) ? 4 : 10); i++){  
    /* do something with */ 
}

должна выполнить работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...