PIC学習中に知った#defineの本当の意味

今日はPICでのLEDのPWM調光の学習の前に、

C言語の「前処理」について整理しました。

①今日の気づき

#define は変数ではないと言うことに今日初めて知りました。

正確には

「文字列の置き換え」

だった。

こんなこと本に載ってたかな…隅々まで読んでなかっただけかも

 

 

②何が違うのか

c

#define A 5+3

int B = 5+3;

違いその1

Aはメモリを使わない。

BはRAMを使う。

 

違いその2

Aは”存在しない”。

Bは”箱がある”。

 

 

③ハマった例

変数SQUAREに任意の数の2乗を代入することを考える

c

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

int main(void){
   
   int y = SQUARE(1+2);

   printf("%d",y);
    
}

とすると、

“5”

が表示される。

なぜなら前処理でこうなるから:

c

int y = 1+2 * 1+2;

つまり、前処理は”計算”ではなく、

”文字の置き換え”なので、

演算の優先順位的に

先に”2×1”が処理され、

次に”1+2+2”が処理されたため。

 

#defineで処理するには、

c

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

int main(void){
    int y = SQUARE(1+2);

    printf("%d", y);
    
}

こうすれば、計算式は

y = (1+2)*(1+2)

となり、無事に”9”が出力されます。

 

これが変数での処理の場合だと次のようになります

c

#include <stdio.h>
int main(void){

    int x = 1 + 2;
    int SQUARE = x * x;

    printf("%d",SQUARE);
    
}

これでちゃんと出力は”9”

「前処理」という概念が腑に落ちました。

  

  

  

④今日の理解

C言語には段階がある

・前処理

・コンパイル

・実行

今まで何も意識していまでんでした。

今まで全部ごちゃ混ぜに考えていましたが、

これからは、これも踏まえて

プログラムを考えなければならないといけないと思いました。

  

 

⑤明日へ

明日はPWM。

理論を整理できている(と思う)。

あとは動かすだけ。

少し怖い。

また意味不明すぎて挫折するかもしれないから。

でも頑張りたいと今は思います。

コメント

タイトルとURLをコピーしました