【问题标题】:Why increment operator doesn't work? [duplicate]为什么增量运算符不起作用? [复制]
【发布时间】:2011-11-11 14:05:25
【问题描述】:

可能重复:
Undefined Behavior and Sequence Points

int a=10;

a=a++;


a=++a;


a=(a++);

你们能解释一下为什么这些案例都不起作用吗?

【问题讨论】:

  • 它们都有效,只是没有按照您的预期工作。
  • @PeterLawrey:“他们都工作”是什么意思?具有未定义行为的代码很难说是“工作”。
  • 我刚刚看到这个问题除了C++之外还被标记为java。如果您对这两种语言的答案感兴趣,您应该在您的问题中澄清这一点(并且可能删除使用 cout 这使得这个问题看起来只是关于 c++)。
  • @LucTouraille 我认为他的意思是它们的行为都符合代码的预期,因此对于 OP 来说,错误的是预期的行为而不是代码。

标签: c++


【解决方案1】:

正确使用它:

int a = 10;
a++;
cout << a;
++a;
cout << a;

【讨论】:

  • 我知道正确的方法,我只是想知道这有什么问题:(
  • @Sanjay,你还没有解释它有什么问题。
  • @PeterLawrey 当我尝试在 codepad.org 中运行它时出错,用 c++ 编码。如果需要,请编辑问题:) 这才是我真正的意思!
【解决方案2】:

http://codepad.org/cYXEuRuQ回答此代码的 C++ 问题

#include<iostream.h>
int main()
{
int a=10;
a=a++;
cout<<a;
cout<<"\n";
a=++a;
cout<<a;
cout<<"\n";
a=(a++);
cout<<a;
cout<<"\n";
}

当编译打印时

cc1plus: warnings being treated as errors
In function 'int main()':
Line 5: warning: operation on 'a' may be undefined
Line 8: warning: operation on 'a' may be undefined
Line 11: warning: operation on 'a' may be undefined

这是一个警告,指出所使用的操作未定义,如果可能,不应使用。这是因为在 C++ 中,++ 相对于其他表达式的求值顺序没有定义,并且在所有编译器中都不相同。 (通常没关系,也不是问题,除非在这样的边缘情况下)

网站更进一步,将警告视为错误,不运行代码。


如果你翻译成 Java,它会打印出来

10
11
11

正如预期的那样。 “不工作”是什么意思?

该行为是在 Java 中定义的,但正如 LucTouraille 指出的那样,它没有在 C++ 中定义,因此您不能期望所有编译器都具有相同的特定行为。

另一个例子。

int a = 3;
a = a++ * a++;
System.out.println(a); // will always be 12 in Java.

和这个一样

{
    int t1 = a;
    a = a + 1;
    int t2 = a;
    a = a + 1;
    a = t1 * t2;
}

【讨论】:

  • 不,最后一个值是11。我刚刚运行它。
  • 我尝试了 Java 6 和 7,第二个示例产生了 12 为什么您会认为 a=a++a=(a++) 会有所不同?
  • @PeterLawrey:我认为他指的是a=(a++);,它会返回11
  • @TheEliteGentleman,你是对的,问题已被重写。我之前假设每个表达式都在int a=10; 之后
【解决方案3】:

算法的顺序:

    int a=10;

    a=a++;
    System.out.println(a);

    a=++a;
    System.out.println(a);


    a=(a++);
    System.out.println(a);

如下:

a=++a; 表示 a 在将表达式分配给 a 之前先递增。因此a = 11

a=(a++);的意思可以理解为

b = a;
a++;
a = b;

因此为什么您会收到11 的价值。

【讨论】:

    【解决方案4】:

    他们都应该工作。 我不确定您使用的是哪种语言。但如果你使用 C/C++,它应该可以工作。

    【讨论】:

    • 这是不正确的,这些语句的行为在 C++ 中是未定义的。
    猜你喜欢
    • 1970-01-01
    • 2014-05-19
    • 2015-07-06
    • 1970-01-01
    • 2017-03-16
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多