代码之家  ›  专栏  ›  技术社区  ›  Nazarii Bardiuk

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

  •  -2
  • Nazarii Bardiuk  · 技术社区  · 15 年前

    我朋友给我发了个笑话:

    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 回复  |  直到 10 年前
        1
  •  11
  •   cdhowie    15 年前

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

    在第二个例子中, ++c 增量 c类 再次返回12,因为它是一个预增量。第二次 c类 计算结果也为12,因为它是存储在 c类 . 所以这个表达式最终被计算为 12 - 12 ,等于0。

        2
  •  2
  •   khachik    15 年前

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

        3
  •  1
  •   AsDuskFalls    15 年前

    不同之处在于使用的运算符是++c和c++

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

    而且,cdhowie的回答解释得更清楚

        4
  •  1
  •   Community Mohan Dere    9 年前

    第一个println输出0或-1,第二个输出0或1都未定义。编译器可以先计算左侧或右侧,因此增量在计算右侧时是否生效将取决于编译器(实际上,编译器可以一次又一次地做一件事)

    只保证下一次增加 sequence point . 减法不是序列点。

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

        5
  •  0
  •   Tommy Lacroix    15 年前

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

    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
    
        6
  •  0
  •   Nemeth    15 年前

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

    这里有一条很好的消息:

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

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

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

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

    一开始可能会混淆,但是如果x是一个值为5的整数

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

    如果你这样做之后

    积分b=x++; 现在您已经告诉编译器获取x(6)中的值并将其分配给b,然后返回并递增x。因此,b现在是6,而x现在是7。下面的清单显示了这两种类型的用法和含义。”

        7
  •  0
  •   user34537user34537    15 年前

    我用这个C++代码

    原因很简单。++运算符复制变量,增加值,然后返回复制的值。假设从左到右对运算符求值,它将传递10-10(然后inc C),因此始终为0。但是,在大多数情况下,依赖于顺序是“未定义的行为”,一些编译器(如gcc)会报告一个警告(例如 http://codepad.org/UPBqO38B )

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