2013年11月5日火曜日

開発環境

C実践プログラミング 第3版 (Steve Oualline (著)、 望月 康司 (監訳) (翻訳)、谷口 功 (翻訳)、オライリー・ジャパン)のⅡ部(単純なプログラミング)の10章(Cプリプロセッサ)、10.2(条件付きコンパイル)、10.3(インクルードファイル)、10.4(パラメータをとるマクロ)、設問 10-6を解いてみる。

その他参考書籍

設問 10-6.

SQR((++counter) * (++counter))

と展開される。よってループの1ッ回ごとにカウンタは2だけ増加する。

確認。

コード

sample.c

#include <stdio.h>
#define SQR(x) ((x) * (x))

int main()
{
    int counter;
    
    counter = 0;
    while (counter < 5){
        printf("x %d, x squared %d\n", counter, SQR(++counter));
    }
    
    return (0);
}

makefile

CC=cc
CFLAGS=-g

sample: sample.c
 $(CC) $(CFLAGS) -o sample sample.c

clean:
 rm -f sample

入出力結果(Terminal)

$ make
cc -g -o sample sample.c
sample.c:10:53: warning: unsequenced modification and access to 'counter'
      [-Wunsequenced]
        printf("x %d, x squared %d\n", counter, SQR(++counter));
                                       ~~~~~~~      ^
sample.c:2:18: note: expanded from macro 'SQR'
#define SQR(x) ((x) * (x))
                 ^
1 warning generated.
$ ./sample
x 0, x squared 2
x 2, x squared 12
x 4, x squared 30
$

プログラムが期待したどおりの出力を行うように修正。(マクロのパラメータで値を変更しないようにする。)

コード

sample.c

#include <stdio.h>
#define SQR(x) ((x) * (x))

int main()
{
    int counter;
    
    counter = 0;
    while (counter < 5){
        ++counter;
        printf("x %d, x squared %d\n", counter, SQR(counter));
    }
    
    return (0);
}

入出力結果(Terminal)

$ make
cc -g -o sample sample.c
$ ./sample
x 1, x squared 1
x 2, x squared 4
x 3, x squared 9
x 4, x squared 16
x 5, x squared 25
$

0 コメント:

コメントを投稿