“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++); }