有人可以解释为什么这段代码给出了输出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;
}
答案 0 :(得分:2)
在cout
行中,可以在评估a.b()
之前或之后调用a.a.b
。初学者有时会在这种代码中采用从左到右的评估,但实际上这不是C ++的规则。
这两种不同的可能性会解释您的10
和11
。为避免含糊不清,你可以写:
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有一些很好的信息。