我的朋友给我发了个笑话:
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
答案 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++);
}