2013-05-12 30 views
1

我是一個Web開發人員和各種語言的程序員,當我回到以前的語言時,這讓我感到困惑。有人可以請回答這個問題,因爲這個問題沒有被我回答,而且測驗基本上把我的答案看成是錯誤的。C中的郵政增量查詢

int m, n; 
    m=6; 
    n=m++; 
    printf("%d %d", m,n); 

    ----------- 
    Options 
    a: 6 6 
    b: 6 7 ---> the answer i think is right 
    c: 7 6 ---> the right answer by quiz server 
    d: 7 7 

請幫我通過解釋的答案,只是因爲我想答案被扭轉

+0

使'printf(「%d%d」,n,m);'和schwuppdiwupp'b'是正確的。 – 2013-05-12 20:56:12

回答

0

它的一個小竅門的問題。

m=6; //simple enough, m now equals 6 
n=m++; //post increment operator returns old value so n becomes 6. 

但M記被遞增到7

所以現在,M = 7和n = 6

這正是被打印出來。

最簡單的檢查方法是將代碼粘貼到調試器中並逐步完成。如果需要,您可以創建更精細的臨時變量。

5

後增量運算符返回原來的價值然後增量。

這意味着您的測驗服務器是正確的。

n=m++; 

分配的mn然後遞增m原值,留下

n=6, m=7 
+1

這個答案很微妙。看到我對保羅答案的評論。 – 2013-05-13 04:53:44

3

測驗服務器是正確的:

m=6;  // m = 6 
n=m++; // n = m = 6; m = m + 1 = 7; 

注意的m的遞增後出現上述後的任務。

+0

你最後的陳述是微妙的錯誤。 c標準不要求以任何順序發生遞增和分配的副作用。正確的說法是分配的值是增量前的值。如果原始值存儲在臨時中,則可以在增量之後進行分配。 – 2013-05-13 04:52:25

+1

@Eric:是的,但我認爲就程序員(尤其是noob程序員)而言,這並沒有什麼區別。 – 2013-05-13 04:57:15

0

好吧,我不會告訴任何不同,但相同的上述所有沒有,但我可以提供一些例子

// Example 1 
m = 6 ;/very simple no explanation here 

// Example 2 
m++ = 6; 
/** 
    This can be rewritten as 
    m = 6; 
    m = m+1; 

**/ 

// Example 4 
n = m++; // kind of your case 
/** 
    This can be re qritted as 
    n = m; 
    m = m+1; 
**/ 

// Example 5 

n++ = m++ + 1; // little complex 

/** 
    This can be rewritten as 
    n = m+1; 
    n++; 
    m++; 
**/ 

簡單的理論

分配前

預增的作品和分配後的後增量不一定是正確的,但因爲有些情況下這些運算符的廣泛使用會產生不可預知的結果。