2013-07-14 2 views
3

В следующем коде:C - указатель арифметика

int strlen(char *s){ 
    char *p = s; 

    while(*p++ != '\0'); 

    return p - s; 
} 

Почему выше оценивают иначе, чем это:

int strlen(char *s){ 
    char *p = s; 

    while(*p != '\0') p++; 

    return p - s; 
} 

Это мое понимание того, что выражение будет оценивать первый, а затем увеличить.

+0

Вы понимаете, что существует разница между «i ++» и «++ i'? –

+0

Оба увеличивают переменную на 1 и приводят к тому же ответу, если не в выражении. Я могу правильно использовать их на практике, но мне показалось, что подобное использование с указателями дало разные результаты. Как и в: if (i ++> 5), исходное значение i будет использоваться и увеличиваться после оценки. – sherrellbc

+0

Потому что между ними есть разница, но это не имеет никакого отношения к указателям. Попробуйте 'int i = 3, j = 3; printf ("% d,% d \ n", ++ i, j ++); '. –

ответ

10

в первом коде p увеличивается, независимо от того, было ли условие while() истинным или ложным.

Во втором фрагменте кода p увеличивается, только если while условие было правдой.

+0

Spot on answer +1 :) – 0decimal0

+0

@PHIfounder thanks :-) –

+0

Bhai **: ** сначала может быть исправлено как 'while (* p ++); return (p-s -1); ' –

0

В первом случае: -

while(*p++ != '\0'); 

р будет увеличиваться сразу после вычисления выражения, независимо от того, условие является истинным или ложным, поскольку ++ является частью условного выражения.

Принимая во внимание, во втором: -

while(*p != '\0') p++; 

Первое условие будет проверено, и если это так, то только р будет увеличиваться.

+0

Нет, я думаю, что сравнение происходит до приращения ** обоих ** случаев. '++ p' будет делать приращение перед сравнением. Но в первом случае инкремент выполняется, даже если длина строки равна нулю. –

+0

@Sanjay, Oh ... да на самом деле приращение будет происходить сразу после проверки условия. Независимо от того, является ли это истинным или ложным (первый случай). Я забыл, что это приращение. ;) –

+0

условие сначала проверяется, если '* p' содержит' \ 0' или нет. Если это так, во втором фрагменте увеличивается приращение 'p ++'. Принимая во внимание, что 'p' будет увеличиваться независимо от того, есть ли условие, где true или false в первом фрагменте. –

2

Рассмотрите последний шаг во время цикла, когда *p = '\0'.

В 1-й код:

while(*p++ != '\0'); 

p еще получить один шаг, и указатель на элемент за '\0'.

В 2 й код:

while(*p != '\0') p++; 

*p != '\0' это не так, так что пока конец цикла, р не получают приращения. p Указатель на '\0'.

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