为啥增量运算符不起作用? [复制]

Posted

技术标签:

【中文标题】为啥增量运算符不起作用? [复制]【英文标题】: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++);

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

【问题讨论】:

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

以上是关于为啥增量运算符不起作用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

修改php.ini不起作用是为啥

为啥 JsonP 不起作用? [复制]

为啥最小项目间距不起作用? [复制]

为啥 memset 功能不起作用? [复制]

为啥问号在 %% 内不起作用? [复制]

为啥这个 DirectoryInfo 比较不起作用? [复制]