C++ - 奇怪的是,输入被颠倒了

ste*_*ytw 5 c++ input output

我发现了一些奇怪的东西,我测试了这段代码:

#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)

以前有人经历过这个吗?谢谢.

-编辑-

谢谢大家的答案!!!

Fer*_*eak 9

这感觉就像未定义的行为和编译器相关:

cin>>a[i++]>>a[i++]>>a[i++];
Run Code Online (Sandbox Code Playgroud)

(主人,如果我错了请纠正我)


Bat*_*eba 9

该语句的行为cin>>a[i++]>>a[i++]>>a[i++];实际上是未定义的.这是因为没有序列点.

您不知道何时i会增加,因此您的输出并不令人惊讶.

http://en.wikipedia.org/wiki/Sequence_point

  • @juanchopanza序列点(或C++ 11中概念之前的顺序)创建了一个部分排序.所有对`operator >>的调用都是在提供其参数的`a [i ++]`之后排序的,但是在第一次调用之前没有排序`a [i ++]`.(对'operator >>的调用是有序的,因为存在数据依赖性:第二个调用的第一个参数是第一个的返回值.) (3认同)

fre*_*low 5

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,yz:

cin.operator>>(x).operator>>(y).operator>>(z);
Run Code Online (Sandbox Code Playgroud)

您可能希望编译器来替代x,yz如下:

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)