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

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

问:C和C ++有什么区别?

A.没什么,因为:(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 

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

 0 1 

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

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

因为c++ - c变为(c - c-incremented-by-one) ,它是-1,而++c - c变为(c-incremented-by-one - c-incremented-by-one) ,即0。

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

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

cdhowie的回答也解释得更好

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

增量仅保证在下一个序列点发生 。 减法不是序列点。

编辑:Bah,当问题被标记为C / C ++时写了答案。 序列点不适用于Java 。 我已经离开了答案,以防其他人在考虑C / C ++表达式时发现它很有用

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

 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 

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

这是一个很好的文字:

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.下面列出了两种类型的用法和含义。“

我用过这个C ++代码

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

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