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(1を返す)が最初に評価されるb場合、true( 1gooを返す)になります。

goo(0を返す)が最初に評価さbれる場合、 falsefoo1を返す)になります。

于 2013-02-06T09:05:47.607 に答える
3

結合性のままにしておくと、言語で指定されていないパラメーターが評価される順序には影響しません。これは単に、「a == b == c」と書くと、それを((a == b)== c)と解釈することを意味します。ただし、a、b、cを事前に、好きな順序で計算できます。

于 2013-02-06T09:07:45.957 に答える