-2

When I run this program I get output as 2

#include<iostream.h>
#include<conio.h>
void main(){
    clrscr();
    int a = 10;
    int c = a-- - --a;
    cout<<c;
    getch();
}

... but when I just modify it to

#include<iostream.h>
#include<conio.h>
void main(){
    clrscr();
    int a = 10,c;
    c = a-- - --a;
    cout<<c;
    getch();
}

... I get output 0. WHY? In java both the of them gave output as 2. Whats wrong with C++? Explain :(

4

2 回答 2

3

C++ 没有问题,但是你使用它的方式有问题。

该表达式a-- - --a在 C++ 中具有未定义的行为,并且任何事情都可能发生。

最干净的解决方案是不要编写这样的代码(即使它是合法的,我也不会这样做)。

于 2012-07-11T09:47:47.313 回答
1

详细说明卢奇安的回答。在 C++ 中,未指定在表达式内计算子表达式的顺序。这意味着在以下表达式中:

int c = a-- - --a;

有两个同样有效的评估命令。

  1. 先求值a--(returns 10),然后求值--a(returns 8),再减去(returns 2)。
  2. 先求值--a(returns 9),然后 求值a--(returns 9),再减去(returns 0)。

这是为了改善编译器的优化机会。自然,这意味着在 C++ 中使用依赖于求值顺序的表达式是错误的,因为无法知道编译器将选择哪个顺序。在 C++ 和 Java 中,效率和避免错误之间的权衡是不同的。

于 2012-07-11T09:56:35.053 回答