不是C++运算符==假定是左结合的吗? 为什么这个C++代码打印它打印的内容?< /P> #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; }

不是C++运算符==假定是左结合的吗? 为什么这个C++代码打印它打印的内容?< /P> #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; },c++,C++,关联性与求值顺序无关 事实上,您正在调用未指定的行为。您无法判断==的哪个部分将首先求值 想想这个: int x; // x is 0 initially int foo() { x++; return x; } int goo() { return x; } int main() { bool b = foo() == goo(); } 如果foo首先返回1,那么b将为真,goo将返回1 如果goo首先返回0求值,b将为false,foo将返回1。关联性与求值顺序

关联性与求值顺序无关

事实上,您正在调用未指定的行为。您无法判断==的哪个部分将首先求值

想想这个:

int x;  // x is 0 initially
int foo()
{
   x++;
   return x;
}
int goo()
{
   return x;
}

int main()
{
   bool b = foo() == goo();
}
如果foo首先返回1,那么b将为真,goo将返回1


如果goo首先返回0求值,b将为false,foo将返回1。

关联性与求值顺序无关

事实上,您正在调用未指定的行为。您无法判断==的哪个部分将首先求值

想想这个:

int x;  // x is 0 initially
int foo()
{
   x++;
   return x;
}
int goo()
{
   return x;
}

int main()
{
   bool b = foo() == goo();
}
如果foo首先返回1,那么b将为真,goo将返回1


如果goo首先返回0求值,则b将为false,foo将返回1。

保持关联不会影响语言未指定的参数求值顺序。这仅仅意味着,如果您编写a==b==c,那么它将把它解释为a==b==c。但是它可以提前计算a、b和c,并且可以按照它喜欢的任何顺序进行计算。

它保持关联性并不影响其参数的计算顺序,这是语言所没有规定的。这仅仅意味着,如果您编写a==b==c,那么它将把它解释为a==b==c。但它可以提前计算a、b和c,并且可以按照它喜欢的任何顺序进行计算。

我在v2上看不到UB。请记住,函数调用引入序列点,v2上的所有读取和修改都是通过函数调用完成的。未指定的行为,是。否,这需要文档和一致性。这是一对不确定顺序的评估。它们在每次执行时的顺序可能不同,但它们总是按顺序排列的。我在v2上看不到UB。请记住,函数调用引入序列点,v2上的所有读取和修改都是通过函数调用完成的。未指定的行为,是。否,这需要文档和一致性。这是一对不确定顺序的评估。它们在每次执行时的顺序可能不同,但它们总是按顺序排列的;v2.向后推1;b=v2.end;还有一个=B在我看来,过去的结束迭代器应该在插入或删除元素后更改,这似乎有点违反直觉。。。这实际上是向量的一个性质。把它改成list,你会得到一些别的东西。我认为比评估顺序更有趣的是a=v2.end;v2.向后推1;b=v2.end;还有一个=B在我看来,过去的结束迭代器应该在插入或删除元素后更改,这似乎有点违反直觉。。。这实际上是向量的一个性质。将其更改为list,您将获得其他内容。