История изменений
Исправление
arturpub,
(текущая версия)
:
что «i» инкрементируется когда условие в цикле ложно
Не инкрементируется после того, как оно стало ложным. А до — инкрементируется. Рассмотрим более простой случай:
const char *t = "abc\n"; // 'a', 'b', 'c', '\n', '\0'
int i, c;
for (int i = 0; (c = t[i]) != 0 && c != '\n'; i++) {
s[i] = c;
Развертка:
i = 0
l0:
if !((c = t[i]) != 0 && c != '\n') goto l1
//if (c = t[i]) == 0 || c == '\n' goto l1
s[i] = c
i++
goto l0
l1:
Трейс:
i = 0
condition is true (t[0] is 'a')
s[0] = 'a'
i = 1
condition is true (t[1] is 'b')
s[1] = 'b'
i = 2
condition is true (t[2] is 'c')
s[2] = 'c'
i = 3
condition is FALSE (t[3] is '\n')
// i == 3, s == "abc[garbage]"
Исходная версия
arturpub,
:
что «i» инкрементируется когда условие в цикле ложно
Не инкрементируется после того, как оно стало ложным. А до — инкрементируется. Рассмотрим более простой случай:
const char *t = "abc\n"; // 'a', 'b', 'c', '\n', '\0'
int i, c;
for (int i = 0; (c = t[i]) != 0 && c != '\n'; i++) {
s[i] = c;
Развертка:
i = 0
l0:
if !((c = t[i]) != 0 && c != '\n') goto l1
//if (c = t[i]) == 0 || c == '\n' goto l1
s[i] = c
i++
goto l0
l1:
Трейс:
i = 0
condition is true (s[0] is 'a')
s[0] = 'a'
i = 1
condition is true (s[1] is 'b')
s[1] = 'b'
i = 2
condition is true (s[2] is 'c')
s[2] = 'c'
i = 3
condition is FALSE (s[3] is '\n')
// i == 3, s == "abc[garbage]"