|
条件式で代入する
最初に次の例題を見てみましょう。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
int size = 256;
char *pstr = NULL;
if (pstr = (char *)malloc(size))
{
strcpy(pstr, "sample program");
printf(pstr);
free(pstr);
pstr = NULL;
}
return 0;
}
|
ここで注目したいのはif文の条件式です。pstrにmallocの戻り値を代入していますが、条件式のところに代入処理を書いています。代入処理がどうやって条件として評価されているんだ?と思いますよね。
このようにif文やwhile文の条件式に代入処理を書くと、代入先の値が評価に使われます。なので、次のように書くのと同じことになります。
pstr = (char *)malloc(size);
if (pstr)
{
...
}
|
わざわざ代入してからif文を書くよりも、代入と評価を一度に行えるので、最初の書き方のほうがすっきりしますよね。ただし、この書き方はgcc
-Wallでは次のような警告が出ます。
suggest parentheses around assignment used as truth value
|
これは、"="と"=="を書き間違えているのではないか?と教えてくれているわけです。実際そういう間違いをすることもよくあります。
これを避けるために、次のように書いたほうが良いでしょう。
if ((pstr = (char *)malloc(size)) != NULL)
{
...
}
|
この書き方はよく見かけるのではないでしょうか。最初に代入してから評価をしています。この場合は代入文が代入先を返し、それが評価に使われます。(代入演算子の演算結果が代入先を返すと言ったほうがわかりやすいでしょうか)
|