2011-10-03 24 views
1

我有一個非常簡單的問題。Postfix遞減

在這段代碼中,n的值會減少嗎?

#include<stdio.h> 
void func(int n) 
{ 
    //text// 
} 

int main() 
{ 
    int n=10; 
    func(n--); 
    return 0; 
} 

現在當FUNC()被調用爲n遞減的值時控制又回到主()或者是它遞減當時只有但N = 10被傳遞到FUNC()。 請解釋一下,如果有一種方法來檢查價值,那麼這將是非常有用的。

回答

6

當一個函數被調用時,它的所有參數都被評估(按照實現定義的順序)函數可以開始之前 - 它是一個序列點。所以,在之後所有的參數都被評估了,函數終於可以開始了。

這是什麼意思是n--被評估併產生該函數的值10。目前功能已經開始n已經是9,但函數的n參數保存值10

一個簡單的方法來檢查:

void func(int n, int *np) 
{ 
    printf("Outside: %d\n", *np); 
} 

int main(void) 
{ 
    /* ... */ 
    func(n--, &n); 
} 
+1

+1,我更喜歡使用指針在我使用的全球 – Flexo

+0

但是當我們使用++ N,則增加值傳遞,爲什麼? –

+1

@ Mr.32因爲'++ n'產生的副作用與產生的值相同。 – cnicutar

2

減量將調用之前發生func,但是func將被傳遞舊值的副本還在。

考慮以下修改你的程序,它說明了這一點:

#include <stdio.h> 

static int n; 

void func(int m) 
{ 
    printf("%d,%d\n", n, m); 
} 

int main() 
{ 
    n = 10; 
    func(n--); 
    return 0; 
} 

打印:

9,10

0

我覺得你的問題是此代碼更好表示:

#include <stdio.h> 

static int global_n; 

void func(int n) 
{ 
    printf("n = %d, global_n = %d\n", 
      n, global_n); 
} 

int main() 
{ 
    global_n = 10; 
    func(global_n--); 
    return 0; 
} 

這表明函數傳遞了舊值,但是遞減發生在調用之前。

n = 10, global_n = 9