2016-07-21 3 views
2

У меня есть код:Присваивание в условном операторе

while (i = j) { 
    /* not important */ 
} 

как долго это будет работать while петли? Это до момента, когда значение переменной j равно нулю?

+1

Каждый здравомыслящий компилятор будет предупреждать о таком выражении, как условие. Потому что это ошибка commone для foget второго '=' for '=='. Это также плохая практика. Оберните явное сравнение или переместите присвоение из условия (что требует 'break' внутри цикла). – Olaf

+2

И это ** назначение **, а не инициализация! – Olaf

ответ

4

Для while свойств цикла, со ссылкой на главу C11, §6.8.5/p4, (курсив мой )

Оператор итерации вызывает утверждение называется тело цикла не будет выполняться многократно до тех пор, контроль экспрессии сравнивает равным 0. [...]

и учитывая назначение внутри условие цикла, со ссылкой на §6.5.16/р3

[...] Выражение присваивания имеет значение левого операнда после присваивания, 111), но не именующего. [...]

Таким образом, каждый раз, когда условие цикла выполняется, первое текущее значение j будет назначен i, а затем, значение i будет принято в качестве контрольного выражения значения .

Иными словами, цикл будет продолжаться до тех пор, пока j не станет 0.

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

while ((i = j)){ 

Меньше путаницы для компилятора и следующий разработчик/сопровождающий.

0

операция присваивания всегда возвращает результат выполнения задания, так что цикл будет продолжаться до тех пор, j == 0, такое поведение существует, так что вы можете операции цепи многих назначений вместе, как так:

a = b = c; 
2

в течение какого времени этот цикл работает? Это до момента, когда значение переменной j равно нулю?

  • while цикл будет будет работать до это condition или expression оценивает, чтобы быть ложным (т.е., 0).

  • В коде ДАwhile цикл работает до того момента, когда значение переменной j равно 0.

Примечание: Оператор присваивания в C возвращает значение переменной, который был назначен, то есть значение выражения i = j зева равным j.

  • В while(i = j), первый i назначается со значением j, а затем выражение вычисляется ли истинным или ложной.

  • Почему бы не попробовать простую программу :):

    #include <stdio.h> 
    
    int main(void) 
    { 
        int i = 0,j =10; 
        while (i = j) 
        { 
         printf("in loop when j = %d\n",j); 
         j--; 
        } 
        printf("exited loop when j = %d",j); 
    } 
    
  • выход:

    in loop when j = 10 
    in loop when j = 9 
    in loop when j = 8 
    in loop when j = 7 
    in loop when j = 6 
    in loop when j = 5 
    in loop when j = 4 
    in loop when j = 3 
    in loop when j = 2 
    in loop when j = 1 
    exited loop when j = 0 
    
Смежные вопросы