1

为什么这个 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
4

2 回答 2

7

关联性与评估顺序无关。

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

想一想:

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

int main()
{
   bool b = foo() == goo();
}

如果foo(returns 1) 先计算,b将是true(goo将返回 1)。

如果goo(returns 0) 首先计算,b将是false(foo将返回 1)。

于 2013-02-06T09:05:47.607 回答
3

它保持关联不会影响评估其参数的顺序,这是语言未指定的。它只是意味着如果你写“a == b == c”,那么它将解释为 ((a==b) == c)。但它可以提前计算出a、b和c,并按照它喜欢的任何顺序。

于 2013-02-06T09:07:45.957 回答