C言語編 目次

 関数設計

 

・関数名の命名規則
・プログラミングに出る!英単語

 ポインタ

 

・データ型とポインタ

 データ型

 

・char *とconst char *は違う
・符号付きと符号なし

 演算子

 

・三項演算子とデータ型の問題

 制御構文

 

・条件式で代入する
・三項演算子を使ったswitch

 構造体

 

・構造体のサイズとアライメント
・構造体メンバのサイズを知る

 配列

 

・配列使用時の注意
・配列の要素数を知る

 メモリ管理

 

・メモリスタック
・動的メモリ確保とメモリリーク

 モジュール設計

 

・モジュール分割
・汎用モジュールとアプリ依存モジュール

 パフォーマンス
  徹底チューニング

 


・どんな処理に時間がかかるのか
・ファイル入出力の効率化
・アルゴリズムを考える1
・アルゴリズムを考える2

 プリプロセッサの便利機能


・2重インクルード防止

 


トップページへ戻る

条件式で代入する

 最初に次の例題を見てみましょう。

#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)
{
    ...
}

 この書き方はよく見かけるのではないでしょうか。最初に代入してから評価をしています。この場合は代入文が代入先を返し、それが評価に使われます。(代入演算子の演算結果が代入先を返すと言ったほうがわかりやすいでしょうか)