'\ 0' связанная проблема - PullRequest
2 голосов
/ 29 октября 2008

Глядя на этот цикл, который копирует одну c-строку в другую:

void strcpyr(char *s, char *t)
{
    while(*s++=*t++)// Why does this work?
        ;
}

Почему мы не проверяем символ '\ 0' в цикле while, как это?

while((*s++=*r++)!='\0')..

Как заканчивается первый цикл?

Ответы [ 7 ]

12 голосов
/ 29 октября 2008

Оператор * s ++ = * t ++ не только назначает следующий символ от t до s, но также возвращает текущее значение * t в качестве результата выражения. Цикл while завершается с любым ложным значением, включая '\ 0'.

Думай об этом так. Если вы сделали:

char c = *s++ = *t++;

в дополнение к копированию символа из * t в * s и увеличению их обоих, он также установит для c текущее значение * t.

4 голосов
/ 29 октября 2008

Когда мы нажимаем '\0' в строке, на которую изначально указывает t, *s++=*t++, которая выполняет назначение, также возвращает значение, назначенное позиции, на которую указывает s или * 1005. *, который оценивается как false и завершает цикл.

Во втором примере вы явно полагаетесь на тот факт, что присвоение возвращает назначенный символ, в то время как в первом примере неявно используется этот факт (и тот факт, что символ 0 (также написанный '\0') считается быть ложным, в то время как все другие символы имеют значение true, поэтому выражение c != '\0' даст тот же результат, что и c.

2 голосов
/ 29 октября 2008

Цикл собирается завершиться, потому что '\ 0' фактически равно 0, и то, что вычисляет «while», является не результатом теста на равенство (==), а правильным значением выражения присваивания .

1 голос
/ 29 октября 2008

Причина, по которой мы явно не проверяем ноль, состоит в том, что в C 0 значение false.

Поэтому цикл

while(*s++=*t++)
;

завершится, когда символ, на который указывает t, равен 0.

-Adam

0 голосов
/ 29 октября 2008

В C a = b на самом деле является выражением, которое оценивается как 'b'. Проще написать:


if(a=b) {
 //some block
}

тогда:


a=b;
if(a!=0) {
 //some block
}

На языке C в пределах if, while для оператора выполняется проверка: является ли выражение ненулевым?

0 голосов
/ 29 октября 2008

Цикл while проверяет результат присваивания. Результатом присваивания является значение, назначенное в левой части оператора. На последней итерации, когда * t == '\ 0', 's 0 присваивается значение s, которое становится значением, которое цикл while считает перед тем, как решить, что пора выходить.

0 голосов
/ 29 октября 2008

Я думаю, что вы хотите написать это:

void strcpyr(char *s, char *t) {
  while (*s++ = *t++);
}

Цикл завершается, когда значение, на которое указывает «t», равно нулю. Для циклов и условных выражений C (и C ++) любое целое число, отличное от нуля, имеет значение true.

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