Синтаксис CКопирование строки символов - PullRequest
4 голосов
/ 24 июля 2011

Проходя через K & R, я увидел следующий фрагмент кода функции strcopy, которая копирует массив символов в другой.

Если t - указатель на первый массив, а s - указатель на массивв который копируется t код:

void strcopy(char *s, char *t){

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

Я запутался в цикле while.Я понимаю, что внутри условия t копируется в s, но я не понимаю, какое условие здесь проверяется.Когда *t++ будет ложным (или нулем)?Предположительно, когда строка символов заканчивается.Мы можем проверить, завершена ли строка, проверив, указан ли символ, на который указывает * '\0'.K & R говорит так же.Но тогда в книге довольно беспечно указывается, что этот тест не нужен.Поэтому мне интересно, что здесь тестируется?

Ответы [ 4 ]

6 голосов
/ 24 июля 2011
*s++ = *t++;

совпадает с:

*s = *t;
t++;
s++;

Условие всегда оценивает левое значение, поэтому в данном случае это похоже на тестирование

while(*s)

Конечно, '\0' оценивается как ложное, поэтому вам не нужно while(something!='\0'), потому что while(something) достаточно.

5 голосов
/ 24 июля 2011

*s++ = *t++ будет соответствовать присвоенному значению.В конце строки *t будет '\0', а при присваивании выражение будет оцениваться как '\0' (что C интерпретирует как false).

Я думаю, K & R говорят, чтодополнительная проверка не требуется, поскольку все обрабатывается в состоянии while.

3 голосов
/ 24 июля 2011

Вы можете явно проверить, достигнут ли завершающий символ, используя

while ((*s++ = *t++) != '\0')
    ;

, если вы посмотрите «\ 0» в таблице ascii, вы увидите, что символ «\ 0» имеетцелочисленное значение 0. Запись чего-то вроде printf("%d\n", '\0'); также докажет это.

Таким образом, приведенное выше выражение while также можно записать как

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

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

0 голосов
/ 24 июля 2011

C присваивает поток справа налево, а цикл while выполняет неявный тест «если».Итак, что делает компиляция с точки зрения теста ...

while(*t != 0) // for the sake off testing if the loop should continue ONLY

Другой пример ...

if (a = b) // note the = vs == so, this will only be true if b != 0

Этакая версия псевдокода под капотомэтот цикл ...

loop:
*s=*t;
if (*s == 0) should_break=1;
s++;
t++;
if (should_break==1) break;
goto loop;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...