LINUX.ORG.RU

История изменений

Исправление 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]"