2015-12-25 3 views
0

В R программирования C книге K &, я наткнулся на этот фрагмент кода для строки копирования:Хотя назначение петли (указатели)

/* strcpy: copy t to s; pointer version 3 */ 
void strcpy(char *s, char *t) 
{ 
while (*s++ = *t++) 
; 
} 

Это правильно копирует два массива символов (конечно, это делает). Вопрос: почему он работает так, как он? Кажется, что внутри не было никаких проверок условий. Существует задание и приращение постов. Чувство моего чувства состоит в том, что это всегда оценивается как истинное (похоже на то, как в то время как (1) всегда оценивает истину, и нам нужно перерыв где-то, чтобы выйти из цикла.

Нет ничего внутри цикла Никакой связанной проверки, нет, если нет, ничего. Все это кажется мне очень рискованным и безрассудным. Может ли кто-нибудь пройти меня через это? Спасибо.

+0

'while (X)' означает 'while ((X)! = 0)' –

ответ

7

Оператор = всегда производит возвращаемое значение: значение правильного операнда. (Вот почему x = y = z = 5 является допустимым выражением.) Когда вы дойдете до конца строки, *t++ указывает на '\0'. Этот символ оценивается как ложный, поэтому он останавливает цикл while.

'\0' характера также называет NUL и это единственный персонаж, который оценивает как ложь, потому что its decimal value is 0, а все остальные символы имеют десятичное значение, отличное от 0. (Это соответствует хорошо известному факту, что число 0 соответствует значению как false, а все остальные числа оцениваются как истинные.)

Here - это тема на эту тему.

+0

Отлично! Это, вероятно, дубликат. Благодаря!! – nirvanaswap

+0

фактически оператор '=' производит значение операнда * left * (что было бы после задания, если быть точным). Пример: 'double d; int x; d = x = 5,5; –

2

s++ и t++ увеличивает каждый указатель, указывая на следующий символ.

Вы можете использовать asignments внутри if с так, например:

int a; 
if (a = 3){ 
    // this code will always be executed 
} 

if (a = 0){ 
    // this code will never be executed 
} 

, так как результат выполнения задания используется для проверки условной. Оператор присваивания возвращает значение присвоенного значения.

Строки в c заканчиваются на '\0', который является 0.

char c = '\0' 
if (c){ 
    // this code will never be executed 
} 

Таким образом, когда t указывает на 0, это будет присвоен *s и результат выполнения задания также будет 0 поэтому цикл while выйдет.

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