“C - C ++”关于后缀/前缀操作排序的笑话

时间:2010-11-19 18:00:40

标签: java syntax operator-precedence

我的朋友给我发了个笑话:

  

Q值。 C和C ++有什么区别?

     

一个。没什么,因为:(C - C ++ == 0)

我试图改变秩序并陷入困境。

看看这段代码:

public class Test {
    public static void main(String args[]) {
        int c = 10;         
        System.out.println(c++ - c);
        System.out.println(++c - c);        
    }
}

为什么会回来:

-1
0

我理解后缀和前缀增量。为什么不是这个结果?

0
1

7 个答案:

答案 0 :(得分:11)

因为在第一个示例中,c从10开始c++递增c并返回10,所以第二个c现在评估为11,因为它已递增。所以评估的最终表达式是10 - 11,等于-1。

在第二个示例中,++c再次递增c但返回12,因为它是预增量。第二个c也计算为12,因为它是存储在c中的新值。因此表达式最终被评估为12 - 12,等于0。

答案 1 :(得分:2)

因为c++ - c变为(c - c-incremented-by-one),为-1,++c - c变为(c-incremented-by-one - c-incremented-by-one)为0。

答案 2 :(得分:1)

区别在于您使用的运算符++ c和c ++

c ++将在计算中使用之前增加该值 ++ c将在计算中使用后递增值

cdhowie的答案也解释得更好

答案 3 :(得分:1)

是否为第一个println输出0或-1,为第二个打印输出0或1是未定义的。编译器可以自由地首先评估左侧或右侧,因此在评估右侧时增量是否生效将取决于编译器(实际上编译器可以一次做一件事而另一件做下)

增量仅保证在下一个sequence point进行。减法不是序列点。

编辑:Bah,当问题被标记为C / C ++时写了答案。 Sequence points don't apply to Java。我已经离开了答案,以防其他人在考虑C / C ++表达式时发现它有用

答案 4 :(得分:0)

因为在一种情况下在操作之前执行增量,而在另一种情况下在操作之后执行增量。

int c = 10;
System.out.println(c); // output 10
System.out.println(c++); // outputs 10
System.out.println(c); // output 11
System.out.println(++c); // output 12
System.out.println(c); // output 12

答案 5 :(得分:0)

这是后缀和前缀增量之间的区别。

这是一篇很好的文章:

http://www.java-samples.com/showtutorial.php?tutorialid=249

“增量运算符(++)和减量运算符( - )分为两种:前缀和后缀。前缀变量在变量名称(++ myAge)之前写入;后缀变量在后面写入(myAge ++)。

在一个简单的语句中,使用它并不重要,但在复杂的语句中,当您递增(或递减)变量然后将结果分配给另一个变量时,它非常重要。在赋值之前计算前缀运算符,在之后评估后缀。

前缀的语义是:递增值然后获取它。后缀的语义不同:获取值然后递增原始值。

这可能会让人感到困惑,但如果x是一个整数,其值为5并且你写了

int a = ++ x; 你告诉编译器增加x(使它成为6),然后获取该值并将其分配给a。因此,a现在为6,x现为6。

如果在这样做之后你写了

int b = x ++; 你现在告诉编译器获取x(6)中的值并将其分配给b,然后返回并递增x。因此,b现在是6,但x现在是7.下面列出了两种类型的用法和含义。“

答案 6 :(得分:0)

我使用了这个C ++代码

原因很简单。 ++运算符创建var的副本,增加值然后返回复制的val。假设操作符从左到右进行评估,它将通过10-10(然后是inc C),因此它始终为0.但是在大多数情况下,依赖于顺序是“未定义的行为”,而某些编译器(如gcc)将报告警告(示例{{3 }})

int main()
{
int c=10;
printf("%d", c-c++);
}