2013-03-11 2 views
0

Если возможно, я хочу знать , как в то время как в C++ интерпретирует этот два разных кода.while() различные выходы; та же самая переменная

Разница между ними состоит в том, что первый из них загружается из предыдущего var, которому уже присвоено значение, а второй код - значение переменной при выполнении while.

Приведенный ниже код является частью очень простой «печать всех файлов в директории» программы сделано с

1. Значение дается при выполнении. Возвращает все файлы по умолчанию

ent = readdir(directory); 
    if(ent == NULL){ 
     cout << "Cannot read directory!"; 
    }else{ 
     while((ent = readdir (directory)) != NULL){ 
     cout << ent->d_name; //this one is the one which works fine; value is given when doing the while 
     } 
    } 

2n. Значение передается переменной перед выполнением операции. Верните бесконечный кучер с первым значением while.

 ent = readdir(directory); 
     if(ent == NULL){ 
      cout << "Cannot read directory!"; 
     }else{ 
      while((ent) != NULL){ 
      cout << ent->d_name; //this one returns an infinite bucle of only the first value of the while 
      } 
     } 

Как C++ интерпретирует их?

+2

Во втором случае 'ent' всегда будет результатом' readdir (directory) ', если это не' NULL', это бесконечный цикл. – Maroun

+1

@MarounMaroun Если у вас нет оператора overloaded ->, который действительно делает что-то действительно странное. – Cubic

ответ

3

Вы не пересматриваете ent во второй версии на каждой итерации. Таким образом, его значение никогда не изменится и, таким образом, если вы войдете в цикл, как только вы всегда останетесь внутри.

Напротив, в первой версии кода while((ent = readdir (directory)) != NULL) задаст новое значение ent на каждой итерации и может выйти из цикла один раз ent (или на самом деле readdir(directory) оказывается NULL.

4

Вы серьезно должны повторно Прочитанные что учебник ...

условием while() заявления оценивается и проверяется перед каждой итерацией.

Так что это:

while ((ent = readdir(directory)) != NULL) 

будет вызывать readdir() При каждой итерации, в то время как другой не будет. С этого момента вы можете сделать логику самостоятельно, вы поймете, почему она работает так, как она.

+0

Для новичков, некоторые из этих слов могут показаться запутанными. Новичок может просто прочитать это как: «* перед каждой итерацией« ent »сравнивается с NULL *», тогда как более опытные программисты, такие как остальные, понимали бы более четко, что означает «оцененный», и последствия того, оценивали каждую итерацию. Это легкая ошибка для новичка, которая делает это при чтении, особенно со всем программистом. (условие, утверждение, оценка, итерация ... в одном предложении) =) Тем не менее, вы вернули свой пост за правильный ответ. –

+0

@JaminGrey No. То, что я написал, не может быть истолковано таким образом. «Условие' while() 'statement - это условие оператора' while() ', а не его вторая часть. – 2013-03-11 21:48:50

+0

Это полностью может быть ошибочно интерпретировано таким образом, * кому-то новому по терминологии *, что было моим единственным моментом. Я говорю о формулировке «** Условие оператора while() оценивается и проверяется перед каждой итерацией. **», а не формулировка вашего сообщения. (Я думал, что вы цитируете непосредственно из учебника, который читает OP) –

0

В первом случае ent = readdir (directory) заставляет его получить следующий каталог, в конечном итоге становясь нулевым и завершив цикл while. Обратите внимание, что это также не выплюнет имя первого каталога.

Второй никогда не меняется - он просто постоянно проверяет, имеет ли значение в (ent) значение null. Поэтому он ТОЛЬКО будет выплеснуть имя первой директории и ничего больше и будет продолжать делать это навсегда.

0

Ваше замешательство может исходить из ошибочной интерпретации readdir. Возможно, вы думаете, что readdir возвращает то же самое («каталог» или «листинг» каталога) каждый раз —, следовательно, ваше недоумение относительно того, почему существует разница в двух кодах, когда, по-видимому (вам), состояние программа не изменилась. Однако эта интерпретация readdir неверна! Каждый вызов readdir возвращает указатель на файл следующий в каталоге, потому что система «запоминает», где вы остановились после каждого вызова.Когда все файлы пройдены, то readdir, наконец, возвращает NULL, после чего состояние while выходит из строя и завершается.

0

В этом фрагменте кода

while((ent) != NULL){ 
    cout << ent->d_name; 
} 

переменная ent никогда не изменяется, поэтому, как только вы входите в то время, вы оказались в ловушке там.

в этом peice кода

while((ent = readdir (directory)) != NULL){ 
    cout << ent->d_name; 
} 

переменная ent изменяется каждый раз, прежде чем состояние во время проверяется, поэтому у вас есть шанс прийти к концу.

Правильный способ перемещения по дереву каталогов, readdir называется рекурсивно.

Смежные вопросы