2016-10-25 3 views
1
#include <stdio.h> 

void change(int *num1, int *num2) { 
    *num1 = 50; 
    ++*num2++; 
} 

int main() { 
    int num1 = 1; int num2 = 2; 
    char bye[] = "Bye World!"; 
    printf("Hello World!\n%s\n", &bye); 
    printf("num1: %d, num2: %d\n", num1, num2); 
    change(&num1, &num2); 
    printf("num1: %d, num2: %d\n", num1, num2); 
    getchar(); 
    return 0; 

} 

Глядя на следующий код, почему выход:внутренних работ вызова по ссылке

Hello World! Bye world! 
num1: 1, num2: 2 
num1: 50, num2: 3 

вместо

Hello World! Bye world! 
num1: 1, num2: 2 
num1: 50, num2: 4 

Под change(), не должны num2 еще увеличивается на один после pre-increment? Я полагаю, это то, что происходит в памяти:

  • num2 = 2 (до вызова, чтобы изменить())
  • num2 = 3 (Преинкремент)
  • num2 = 3 (значение, возвращенное до поста -increment)
  • пит2 = 4 (пост-инкремент)
+0

post-increment to pointer. – BLUEPIXY

+0

'++ * num2 ++' == '++ * (num2 ++)' – kaylum

+0

'++ * num2 ++' == ++ * num2, num2 ++. ваше желание '++ * num2, (* num2) ++.' – BLUEPIXY

ответ

2

Под change() не должны num2 все еще увеличивается на единицу после предварительного приращения?

Нет, не следует. Для этого есть две причины:

  • Pre-increment увеличивает значение; пост-инкремент увеличивает значение указателя - в ++*num2++ первый ++ относится к тому, что это указывает num2, но второй один относится к самому num2 из-за precedence rules: пост-инкремент имеют более высокий приоритет, чем преинкремента и разыменования.
  • Если вы устанавливаете приоритет в круглых скобках, одно выражение не может изменять одно и то же значение дважды - это правило, описанное в Q&A on sequence points.
0
++*num2++; 

означает то же самое, как: т.е. он увеличивает

++(*(num2++)); 

*num2 и num2 один раз. Он не увеличивает *num2 дважды.

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