2014-10-28 4 views
0

Извините за этот простой вопрос, но я не смог найти ответ, если у меня есть цикл while, который выглядит так. Рассчитывает ли он до или после сравнения?While loop with ++ variable

a = 0; 
while(a++ < 5) 
{ 
    .... 

Когда первый запускает цикл он будет смотреть на него как "1 < 5" или "0 < 5". Благодаря

+2

'0 <5' ......... – BLUEPIXY

+1

Почему бы вам не попробовать? 'printf ('% d', a);' в цикле и посмотреть, что произойдет. –

+0

@MarcB: потому что результат печати не был бы неоспоримым и даже встречным интуитивным? – njzk2

ответ

2

Сравнение производится ДО приращение, но тело цикла видит значение ПОСЛЕ icrementation. Итак, в первом запуске вы сравните 0 < 5, но в цикле a будет иметь значение 1.

+0

что, если бы он сказал ++ a? Будет ли приращение сделано до сравнения? – Fjodor

+0

@Fjodor: Да - это было бы выполнено до сравнения, так что вы бы действительно имели 1 <5 –

1

Оператор постфикса применяется «после». Префиксный оператор применяется «до». В случае, если вы предоставили первый раз «а», это значение будет равно 0

Будьте осторожны, так как вы можете столкнуться с этими операторами, если не использовать их с осторожностью. Рассмотрим [ix ++] = a [ix] + 1; возможно, он будет делать то, что вы хотите, может быть, нет ... попробуйте

Просто прочитайте другой комментарий ... очень хорошо, что a примет значение ++ insde цикл.

+1

Независимо от того, работает ли он или нет, 'a [ix ++] = a [ix] + 1' is * неопределенное поведение *, и демоны могут вылететь из вашего носа. –

+0

Возможно, это может быть не то, что вы хотите, в зависимости от того, как вы относитесь к носу: -D – Dweeberly

1

Результат выражения a++ - текущее значение a, поэтому цикл начнется как while (0 < 5).

Результат выражения ++a это значение a + 1, так что, если бы вы написали while (++a < 5), она начала было бы, как while (1 < 5).

В обоих случаях a будет увеличиваться в 1 раз как побочный эффект. Обратите внимание, что побочный эффект не должен применяться сразу после оценки выражения; единственная гарантия заключается в том, что она применяется до следующей точки последовательности (в данном конкретном случае точка последовательности находится в конце условного выражения, поэтому тело цикла увидит обновленное значение a). Таким образом, если у вас есть выражение, как

x = a++ * ++b; 

будет оценена как x = a * (b + 1), но нет никакой гарантии, что a будет увеличиваться до того ++b была оценена, и нет никакой гарантии, что либо будет увеличиваться до того умножение и присвоение. Следующие является одним из многих приемлемого порядка операций:

  1. t1 <- b + 1
  2. x <- a * t1
  3. b <- b + 1
  4. a <- a + 1