Java &引用;C-C++&引用;关于后缀/前缀操作排序的笑话

Java &引用;C-C++&引用;关于后缀/前缀操作排序的笑话,java,syntax,operator-precedence,Java,Syntax,Operator Precedence,我的朋友给了我一个笑话: < 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); }

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

< 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

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


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

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

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


另外,cdhowie的回答更好地解释了第一个println是否输出0或-1,第二个println是否输出0或1是未定义的。编译器可以自由地首先计算左侧或右侧,因此在计算右侧时增量是否生效取决于编译器(实际上,编译器可以一次做一件事,下一次做另一件事)

增量只保证在下一次进行。减法不是序列点


编辑:呸,当问题被标记为C/C++…时,他写下了答案。我留下了答案,以防其他人在考虑C/C++表达式时发现它有用,因为
C++-C
变成
(C-C-逐次递增)
,即-1和
++C-C
变成
(C-逐次递增-C-逐次递增)
为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

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

这里有一段很好的文字:

“增量运算符(++)和减量运算符(-)有两种类型:前缀和后缀。前缀类型写在变量名(++myAge)之前;后缀类型写在(myAge++)之后

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

前缀的语义是:先增加值,然后获取值。后缀的语义不同:先获取值,然后增加原始值

这在一开始可能会让人困惑,但如果x是一个值为5的整数,那么

int a=++x; 您已经告诉编译器递增x(使其为6),然后获取该值并将其分配给a。因此,a现在是6,x现在是6

如果,在这样做之后,你写

intb=x++; 现在你已经告诉编译器要在x(6)中取值,然后将它分配给C++,然后返回并增加x。因此,B现在是6,但是x现在是7。下面的列表显示了这两种类型的用法和含义。 原因很简单。++运算符复制var,增加值,然后返回复制的val。假设运算符从左到右求值,它将通过10-10(然后inc C),因此它始终为0。然而,在大多数情况下,取决于顺序的是“未定义的行为”,一些编译器(如gcc)会报告警告(示例)


张贴代码是NIETEC和C++,请ReaDdUD…从什么时候起,笑话就完全符合事实了?通过改变规则,他们制造了一些有趣的事情。如果你想从字面上理解这一点,
C-C++
是未定义的行为@在C或C++中,使用C类语法的语言不是所有语言。戴维好点。虽然“问题”有点暗示它是关于C和C++的,但这个答案是完全错误的。这两个示例都有未定义的行为?你确定吗?它不是未定义的“第一个println输出0或-1,第二个println输出0或1”。这是未定义的行为。这意味着它可以打印0,-1,42,一些比INT\u MAX大的数字,甚至可以让你的电脑爆炸。实际上,这将是我所说的选择之一。但是你是对的,你不能依赖这个
int main()
{
int c=10;
printf("%d", c-c++);
}