C ++中的结构和函数

时间:2017-03-13 01:42:17

标签: c++ struct

有人可以解释为什么这段代码给出了输出10吗?当我试图分析它时,我的逻辑给出了结果11。

#include <iostream>
using namespace std; 
class A { 
public:     
    A() { a.a = a.b = 1; }   
    struct { int a,b; } a;  
    int b(void); 
};

int A::b(void) { 
    int x=a.a;
    a.a=a.b;
    a.b=x; 
    return x; 
};

int main(void) {     
    A a;
    a.a.a = 0;
    a.b();
    cout << a.b() << a.a.b << endl;
    return 0;
}

2 个答案:

答案 0 :(得分:2)

cout行中,可以在评估a.b()之前或之后调用a.a.b。初学者有时会在这种代码中采用从左到右的评估,但实际上这不是C ++的规则。

这两种不同的可能性会解释您的1011。为避免含糊不清,你可以写:

cout << a.b();
cout << a.a.b << endl;   

(假设订单是你的意图)。

注意:C ++ 17 may change this并定义此代码的左右评估顺序。

答案 1 :(得分:0)

除了使用调试器之外,您还可以使用cout语句来帮助跟踪事件的调用时间。

为了帮助自己跟踪你的程序,我修改了一些缩进并添加了关于什么时候发生的评论:

#include <iostream>
using namespace std; 
class A {
public:
    A() {
        a.a = a.b = 1;
    }
    struct {
        int a,b;
    } a;
    int b(void); 
};

int A::b(void) {
    cout << "Within A::b()" << endl;
    // swap a.a, a.b
    int x=a.a;
    a.a=a.b;
    a.b=x;

    cout << "a.a.a = " << a.a << " a.a.b: " << a.b << endl;

    return x;
};

int main(void) {
    // sets a.a.a = 1, a.a.b = 1
    A a;
    // sets a.a.a = 0, a.a.b = 1
    a.a.a = 0;
    // a.a.a = 1, a.a.b = 0
    a.b();
    // check output here
    cout << a.b() << a.a.b << endl;
    return 0; 
}

上述程序在http://cpp.sh/上显示以下输出:

Within A::b()
a.a.a = 1 a.a.b: 0
Within A::b()
a.a.a = 0 a.a.b: 1
10

总之,它取决于当你致电cout时是否先解析a.b()或a.a.b.在这种情况下,由于cout的工作原理,运算符优先级未定义。 This stackoverflow post有一些很好的信息。