2010-11-19 39 views
-2

我的朋友给我发了一个笑话:“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 

我明白后缀和前缀增量。为什么不是这样的结果?

0 
1 
+4

发布代码nietherç也不是C++,请重新打 – 2010-11-19 18:05:10

+2

猪头...罪什么时候笑话完全符合事实?通过弯曲他们制定一些有趣的规则。如果你想从字面上理解,'C - C++'是未定义的行为! – thecoshman 2010-11-19 18:13:54

+3

@thecoshman:在C或C++中它是,但不是所有使用类C语法的语言。 – 2010-11-19 18:14:34

回答

10

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

在第二个示例中,++c再次增加c,但返回12,因为它是预增量。第二个c的计算结果也为12,因为它是存储在c中的新值。使得表达最终被评价为12 - 12,其等于0。

+0

这个答案是完全错误的。这两个例子都有未定义的行为。 – 2010-11-19 21:30:27

+2

在Java中?你确定吗? – cdhowie 2010-11-19 21:35:34

1

所不同的是在使用操作员++ C和C++

C++将递增的值之前,它是在计算中使用 ++Ç将递增的值后,将其在计算

使用也cdhowie的回答解释它更好

1

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

增量只能保证发生在下一个sequence point。减法不是一个序列点。

编辑:Bah,写这个答案时,问题被标记为C/C++。 Sequence points don't apply to Java。我已经离开的情况下,其他人找到了答案有用考虑C/C++表达式时

+0

它不是未定义“是否为第一个println输出0或-1,第二个输出是0还是1”。这是未定义的行为。这意味着它可以打印0,-1,42,比“INT_MAX”大一些的数字,甚至会让你的电脑爆炸。 – 2010-11-19 21:32:16

+0

是的。在实践中,这将是我所说的选项之一。但你是正确的,你不能依靠这个 – 2010-11-20 13:44:11

2

因为c++ - c变得(c - c-incremented-by-one),这是-1,++c - c成为(c-incremented-by-one - c-incremented-by-one)由于增量之前执行它为0

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 
0

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

这里有一个很好的文本:

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

“无论是增量运算符(++)和递减运算符( - )有两个品种:前缀和后缀,前缀品种写在变量名之前(++ myAge);后缀变量写在(myAge ++)之后

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

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

这可以在第一是混乱的,但如果x是一个整数,其值在5和你写

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

如果这样做之后,则写

INT B = X ++; 您现在已经告诉编译器获取x(6)中的值并将其赋值给b,然后返回并递增x。因此,B现在是6,但,x是现在低于7清单示出了两种类型的使用和含义。”

0

我用这个C++代码

原因很简单。++运算符进行复印var增加值,然后返回复制的val假设操作符从左到右计算,它将通过10-10(然后是C),因此它总是0.然而,在大多数情况下,依赖于顺序是'未定义的行为',并且像GCC编译器的一些会报告警告(例如http://codepad.org/UPBqO38B

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