У меня есть код:Присваивание в условном операторе
while (i = j) {
/* not important */
}
как долго это будет работать while
петли? Это до момента, когда значение переменной j равно нулю?
У меня есть код:Присваивание в условном операторе
while (i = j) {
/* not important */
}
как долго это будет работать while
петли? Это до момента, когда значение переменной j равно нулю?
Для while
свойств цикла, со ссылкой на главу C11
, §6.8.5/p4, (курсив мой )
Оператор итерации вызывает утверждение называется тело цикла не будет выполняться многократно до тех пор, контроль экспрессии сравнивает равным 0. [...]
и учитывая назначение внутри условие цикла, со ссылкой на §6.5.16/р3
[...] Выражение присваивания имеет значение левого операнда после присваивания, 111), но не именующего. [...]
Таким образом, каждый раз, когда условие цикла выполняется, первое текущее значение j
будет назначен i
, а затем, значение i
будет принято в качестве контрольного выражения значения .
Иными словами, цикл будет продолжаться до тех пор, пока j
не станет 0
.
Это говорит, тогда и только тогда вы уверены в части назначения в качестве условия оператора цикла, положить его в двойные скобки, как
while ((i = j)){
Меньше путаницы для компилятора и следующий разработчик/сопровождающий.
операция присваивания всегда возвращает результат выполнения задания, так что цикл будет продолжаться до тех пор, j == 0
, такое поведение существует, так что вы можете операции цепи многих назначений вместе, как так:
a = b = c;
в течение какого времени этот цикл работает? Это до момента, когда значение переменной 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
Каждый здравомыслящий компилятор будет предупреждать о таком выражении, как условие. Потому что это ошибка commone для foget второго '=' for '=='. Это также плохая практика. Оберните явное сравнение или переместите присвоение из условия (что требует 'break' внутри цикла). – Olaf
И это ** назначение **, а не инициализация! – Olaf