为什么这个C ++代码会打印它打印的内容?
#include <vector>
#include <stdio.h>
int p(const char *x) {
printf("%s\n", x);
return 0;
}
int main()
{
if (p("LEFT") == p("RIGHT")) ;
std::vector<int> v1;
v1.push_back(1);
std::vector<int>::iterator it = v1.erase(v1.begin());
if (it == v1.end())
printf("OK\n");
else
printf("FAIL\n");
std::vector<int> v2;
v2.push_back(1);
if (v2.erase(v2.begin()) == v2.end())
printf("OK\n");
else
printf("FAIL\n");
return 0;
}
我对OK / FAIL部分感到困惑。这与LEFT / RIGHT部分相矛盾。这里发生了什么?
我的输出是:
LEFT
RIGHT
OK
FAIL
答案 0 :(得分:7)
关联性与评估顺序无关。
实际上,您正在调用未指定的行为。您无法确定==
的哪个部分会先评估。
想一想:
int x; // x is 0 initially
int foo()
{
x++;
return x;
}
int goo()
{
return x;
}
int main()
{
bool b = foo() == goo();
}
如果首先评估foo
(返回1),则b
将为true
(goo
将返回1)。
如果goo
(返回0)先评估,b
将为false
(foo
将返回1)。
答案 1 :(得分:3)
它是左关联的并不影响其参数的评估顺序,而这些参数是由语言未指定的。它只是意味着如果你写“a == b == c”,那么它会把它解释为((a == b)== c)。但它可以提前计算a,b和c以及它喜欢的任何顺序。