我发现了一些奇怪的东西,我测试了这段代码:
#include <iostream>
using namespace std;
int main() {
int i=0, a[5];
cin>>a[i++]>>a[i++]>>a[i++];
for(int j=0; j<i; j++){
cout<<a[j]<<endl;
}
}
Run Code Online (Sandbox Code Playgroud)
有了这个输入:
1
2
3
Run Code Online (Sandbox Code Playgroud)
并将输入反转为:
3
2
1
Run Code Online (Sandbox Code Playgroud)
我认为它的输出应该与此代码相同:
#include <iostream>
using namespace std;
int main() {
int i=0, a[5];
cin>>a[i++]; cin>>a[i++]; cin>>a[i++];
for(int j=0; j<i; j++){
cout<<a[j]<<endl;
}
}
Run Code Online (Sandbox Code Playgroud)
以前有人经历过这个吗?谢谢.
-编辑-
谢谢大家的答案!!!
这感觉就像未定义的行为和编译器相关:
cin>>a[i++]>>a[i++]>>a[i++];
Run Code Online (Sandbox Code Playgroud)
(主人,如果我错了请纠正我)
该语句的行为cin>>a[i++]>>a[i++]>>a[i++];实际上是未定义的.这是因为没有序列点.
您不知道何时i会增加,因此您的输出并不令人惊讶.
见http://en.wikipedia.org/wiki/Sequence_point
cin>>a[i++]>>a[i++]>>a[i++];
Run Code Online (Sandbox Code Playgroud)
只是语法糖
cin.operator>>(a[i++]).operator>>(a[i++]).operator>>(a[i++]);
Run Code Online (Sandbox Code Playgroud)
现在,这三个电话来operator>>肯定是执行由左到右,但三个参数 a[i++]可评估任何顺序.让我们调用参数x,y并z:
cin.operator>>(x).operator>>(y).operator>>(z);
Run Code Online (Sandbox Code Playgroud)
您可能希望编译器来替代x,y并z如下:
int& x = a[i];
i++;
int& y = a[i];
i++;
int& z = a[i];
i++;
Run Code Online (Sandbox Code Playgroud)
但事实上,编译器提供了更多的自由.在您的情况下,它选择:
int& z = a[i];
i++;
int& y = a[i];
i++;
int& x = a[i];
i++;
Run Code Online (Sandbox Code Playgroud)
正如詹姆斯坎泽指出的那样,它也可以选择:
int& x = a[i];
int& y = a[i];
int& z = a[i];
i++;
i++;
i++;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
269 次 |
| 最近记录: |