为啥增量运算符不起作用? [复制]
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++ 中是未定义的。以上是关于为啥增量运算符不起作用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章