誤解
自分でエキスパートだなぁ・・・と思ってはいても、どーにも色々誤解や勘違いして覚えてる事ってのはあるもんで、反省の意味もこめて記述。
いや、先日コードレビューで間違った指摘しちゃったので・・・ね(汗)
で、何を誤解してたのかっつーと、C言語における演算子の実行順序について。
C言語の演算子って実行順序は保証されないって覚えてました。
確かに、大多数の演算子は保証されてない。
+とか-とか、そんなの。
つまり、このコードの結果は保証されない、と。
void foo(int* a)
{
*a += 1;
*a *= 2;
}
void bar(int *a)
{
*a += 2;
*a *= 2;
}
int main()
{
int n = 10;
int res;
res = foo(&n) + bar(&n);
return 0;
}
{
*a += 1;
*a *= 2;
}
void bar(int *a)
{
*a += 2;
*a *= 2;
}
int main()
{
int n = 10;
int res;
res = foo(&n) + bar(&n);
return 0;
}
このコードの場合、fooが先に実行されるか、barが実行されるかによって結果が変わる(foo先なら48、barが先なら50)。
で、この意識ばかりが先にあって、「&&」、「||」、「,」の3つの演算子に関しては、必ず左から右の順番に解決されるって例外をスルーしてきてました・・・orz
ってことで、こーゆー記述の動作は保証される・・・と。
if ((ptr!=NULL)&&(ptr->xxx==yyy))
はうー、一から入門書読んで勉強しなおそうかな・・・(を
トラックバック URL :