c в то время как вход в цикл - PullRequest
2 голосов
/ 02 августа 2010

кто-нибудь, пожалуйста, объясните мне, почему

int i=0,j=10;
    while(j>0,i++){
    printf("%d%d",i,j);
    j--;
}

не будет работать и

int i=0,j=10;
while(i++,j>0){
    printf("%d%d",i,j);
    j--;
}

работает.

Также, пожалуйста, скажите мне, почему

int i=0,j=10;
while(j>0,++i){
    printf("%d%d",i,j);
    j--;
}

дает бесконечный цикл?

спасибо и всего наилучшего

харша

Ответы [ 4 ]

16 голосов
/ 02 августа 2010

В вашем цикле while вы используете оператор запятой, который оценивает его параметры и возвращает второй. Итак, в ваших примерах:

while(j>0,i++) - returns i before it gets incremented; 
                 that is 0, so loop won't execute at all 

while(i++,j>0) - returns (j > 0) - runs as expected

while(j>0,++i) - returns i - will run until i overflows  max int value
4 голосов
/ 02 августа 2010

Прочтите оператор запятой C . В основном это сводится к тому, что оператор запятой возвращает результат того, что находится справа от запятой - поэтому в вашем первом примере i ++ возвращает 0, и цикл заканчивается. В третьем случае ++ i никогда не равен 0 (по крайней мере, долгое время), поэтому вы получаете бесконечный цикл. Средний регистр в порядке, так как результат j>0 возвращается от оператора запятой, и ваш цикл работает, как и ожидалось.

1 голос
/ 02 августа 2010

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

Аналогично, j>0,++i оценивается как ++i, который будет отличен от нуля до тех пор, пока вы не переполнитесь, поэтому кажется, что цикл выполняется вечно (хотя на самом деле простов течение длительного времени).

i++,j>0 работает, потому что последнее подвыражение - j>0, что является фактическим условием, которое вы хотите.Обратите внимание, что даже несмотря на то, что оператор запятой отбрасывает результат первого выражения (в данном случае i++), он все равно вычисляет это подвыражение, и, таким образом, вы все равно получаете побочный эффект (увеличивая i).

0 голосов
/ 02 августа 2010

В этих случаях у вас есть выражения, которые включают оператор запятой.Оператор запятой оценивает свой левый операнд, затем его правый операнд.В результате получается правый операнд.

На данный момент давайте рассмотрим только ваш последний вопрос:

int i=0,j=10;
while(j>0,++i){
    printf("%d%d",i,j);
    j--;
}

Это не должно быть бесконечным циклом, хотя он может выполнять только бит длиннее, чем ожидалось.Поскольку результат оператора запятой является результатом операнда right , он ожидает, пока ++i станет 0. Поскольку он начинается с 0, он будет циклически повторяться, хотя all возможные значения int до его завершения.С 16-битным int это, вероятно, займет несколько минут.С 32-битным int это займет довольно немного дольше.С 64-битным int это будет бесконечным циклом для любой практической цели - я почти уверен, что умру задолго до того, как он сможет надеяться закончить в любом случае ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...