通过引用呼叫的内部工作

时间:2016-10-25 02:31:31

标签: c

#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不应该在conf.set("spark.dynamicAllocation.enabled","true") 之后增加1 预增量?我想这就是记忆中发生的事情:

  • num2 = 2(在调用change()之前)
  • num2 = 3(预增量)
  • num2 = 3(在增量前返回的值)
  • num2 = 4(后增量)

2 个答案:

答案 0 :(得分:2)

  

++*num2++下,在预增量之后,++是否仍然应该增加1?

不,不应该。这有两个原因:

  • 预增量递增值;后增量递增指针 - 在num2num2适用于(ns cheating-quine) ... stuff here doesn't really matter ... (println (slurp *file*)) 指向的任何内容,但第二个适用于unlist本身到期to precedence rules:post-increment的优先级高于pre-increment和dereference。
  • 如果您通过括号设置优先级,则一个表达式无法修改相同的值两次 - 这是Q&A on sequence points中解释的规则。

答案 1 :(得分:0)

++*num2++;

表示与:

相同
++(*(num2++));

即。每次增加*num2num2。它不会增加*num2两次。