2016-01-24 2 views
-1

Мое понимание следующего кода состоит в том, что ip приращается во втором операторе printf; то извлекается значение, на которое указывает *ip. Но вывод показывает обратное.Приоритет оператора в скобках

#include <stdlib.h> 
#include <stdio.h> 

int main() 
{ 
    int i[2] = { 1, 4 }; 
    int *ip; 

    ip = i; 

    printf("%d\n", *ip); 
    printf("%d\n", *(ip++)); 
    printf("%d\n", *ip); 

    return 0; 
} 

Выход:

1 
1 
4 

Затем, путем перехода к оператору предварительно приращения, ++ip, ожидаемый результат произошел.

код с преинкремента

#include <stdlib.h> 
#include <stdio.h> 

int main() 
{ 
    int i[2] = { 1, 4 }; 
    int *ip; 

    ip = i; 

    printf("%d\n", *ip); 
    printf("%d\n", *(++ip)); 
    printf("%d\n", *ip); 

    return 0; 
} 

Выход:

1 
4 
4 

Мое понимание приоритета операторов в C является то, что () имеют больший приоритет, чем оператор *. С учетом сказанного, почему оператор post-increment, ip++, не оценивается первым - так как он находится в пределах ().

+0

Используйте правило - просто сделайте одну вещь на одной строке кода. Вы не ошибетесь, придерживаясь этого –

+1

Это как раз то, как должно вести себя пост-инкремент, и не имеет ничего общего с приоритетом. – juanchopanza

+0

@EdHeal Это был всего лишь код нуля для тестирования этого вопроса, который у меня был. – cryptic

ответ

3

Независимо от оценочного порядка, ++ip приращений перед возвратом нового значения ip, а ip++ возвращает старое значение ip, а затем увеличивает его. (Или, если хотите, сохраняет старое значение, увеличивает ip, а затем возвращает старое значение.)

В этом разница между пре-и пост-приращением.

В обоих примерах круглые скобки являются избыточными.

1

Мое понимание следующего кода заключается в том, что ip во втором выражении printf увеличивается; то извлекается значение, на которое указывает * ip.

Это на самом деле наоборот, увидеть комментировал код на 2-й Printf: printf("%d\n", *(ip++));

int i[2] = { 1, 4 }; 
int *ip; 

ip = i; // ip points to the first array element i[0] 

printf("%d\n", *ip);  // fetch ip and printf it (i[0] = 1) 
printf("%d\n", *(ip++)); // 1) fetch ip and printf it (i[0] = 1), then 2) increment ip, which now points to i[1] 
printf("%d\n", *ip);  // fetch ip and printf it (i[1] = 4) 
0

Во-первых, как до, так и оператор пост-инкремент имеют больший приоритет, чем * оператора, так *ip++ полностью эквивалентен *(ip++), а *++ip также полностью эквивалентен *(++ip).

Тогда давайте посмотрим на разницу между до и после приращения оператора: Значение ++i равно i+1, в то время как i++ равно i, хотя в любом случае, значение i увеличивается на 1 после того, как * -операционный оператор.

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