2013-05-12 26 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++; 
**/ 

简单的理论

分配前

预增的作品和分配后的后增量不一定是正确的,但因为有些情况下这些运算符的广泛使用会产生不可预知的结果。