Мне интересно, что происходит в предикате c в то время как? - PullRequest
2 голосов
/ 06 февраля 2011

Я видел цикл C while с предикатом as while (* ptr), и ptr обычно имеет тип char *, как это работает?Означает ли это, что "while ()" также будет принимать значения, отличные от 1 или 0, в качестве предикатов?

Ответы [ 7 ]

2 голосов
/ 06 февраля 2011

В C любое ненулевое значение считается «истинным», поэтому while (*ptr) будет повторяться до тех пор, пока *ptr не равно нулю.

1 голос
/ 06 февраля 2011

Давайте немного подробнее остановимся на этом.

Синтаксис while в C означает: «если условное условие истинно, создайте тело; затем, если оно все еще верно, снова выполните тело».

Как отмечает Касабланка, любое значение 0 в C является «ложным»;любое ненулевое значение равно "true".(Стоит подумать, почему они выбрали это; вы можете получить хороший совет, если посмотрите на набор инструкций PDP-11.) Таким образом, вы можете расширить это до

 while /* the expression *ptr is nonzero*/)
     /* do this */

Выражение *prt означает простоwhatever is at the address stored in ptr.

Обычный вид кода, в котором используется этот шаблон, - обработка строк.Скажем, у нас есть

 char myString[] = "Hello, world!" ; // remember char myString[] is equivalent
                                     // to char * myString in C

 char * ptr = myString;              // note ptr points to myString[0]

 while(*ptr){
   putc(*ptr);
   ptr ++;
 }

Теперь, пока ptr указывает на символ в строке, он ненулевой, и цикл продолжается.но по соглашению в C все строки заканчиваются NUL, то есть байтом шириной 0. Поэтому, когда цикл достигает этого последнего NUL, * ptr равен 0, и цикл заканчивается.

Вы можете написать егоболее кратко

 char * ptr = myString;
 while(*ptr) putc(ptr++);

Головоломка: Вы можете написать это еще более кратко?

0 голосов
/ 06 февраля 2011

Поскольку в C наиболее распространенным типом строки является строка с нулевым символом в конце, имеет смысл выполнить цикл, подобный этому иногда

while(*ptr)
{
    printf("%c", *ptr);
    ptr++;
}

, который по существу перемещается от символа к символу в массиве символов, пока не встретится нулевой символ,Конечно, это дурной тон, поскольку '\0', null и 0 не обязательно должны быть одинаковыми в данной системе, но работают в 99% сред.

0 голосов
/ 06 февраля 2011

Это идиома, используемая для перебора C-строки, поскольку C-строки определены как завершенные NUL. Это работает, потому что NUL-символ \0 имеет нулевое значение, и, как вы знаете, нулевое значение приведет к завершению цикла while().

0 голосов
/ 06 февраля 2011

В C любое ненулевое значение считается истинным.

0 голосов
/ 06 февраля 2011

C ожидает, что условие предложения while() является целым числом. Если целое число равно нулю, цикл while завершается, в противном случае он выполняет свое тело и снова вычисляет условие. Широкий спектр вещей считается в С целыми числами, включая символы. символ '\0' (нулевой символ) равен целому числу 0

0 голосов
/ 06 февраля 2011

В C все ноль считается ложным, а все остальное считается истинным. Этот код, по сути, говорит: «пока ptr не является нулевым», то есть заданная строка с нулевым символом в конце является обычным способом обхода строки.

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