今日は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。
理論を整理できている(と思う)。
あとは動かすだけ。
少し怖い。
また意味不明すぎて挫折するかもしれないから。
でも頑張りたいと今は思います。

コメント