C++スコーラ

管理人メモ

最終更新:

cschola

- view
管理者のみ編集可

ここに気づいた人へ

C言語スコーラを終わらせた人はここまでお疲れさまでした。
このページには管理者がC言語を学んで気づいたことやスコーラ内で扱わなかったことのメモを残してあります。

目次


#define

C言語スコーラ第7回 「関数」の練習問題を「#define」を使って解いた人もいると思う。
#defineで定義したものは厳密に言いうと関数ではなく
「マクロ」というもの。つまり関数ではない。
使い方とかは関数と似ているけど関数ではないのでこれで解いたやつを合格にするかどうかは講師個人に任せる。
迷ったら講師同士で相談でもしとけ。

ただ、マクロを使うことは推奨しない
というか、使わないで済むなら使うな。
初学者(C言語スコーラ受講者)が使うには危険が多すぎる。


マクロの使い方

マクロでは以下のような書き方で処理や変数を定義する。
変数のように名前で呼び出したい定数なんかで使うことが多い。
詳しい使い方は個人で調べてくれ。そのほうが正確な情報を得られる。
 #define マクロ名 (引数) 処理
 #define 変数名 値

マクロのデメリット

マクロにはいくつか注意点がある。これがまさに初学者が使うべきではない理由そのものだ。

・型や構文のチェックが効かない
コードを書いていて文法エラーなどがあった際Visual Studioはエラー箇所に赤い波線を引いたり、エラー文を表示したりしておかしい点があると教えてくれた。しかし、マクロはエラーチェックの対象外なのでエラー表示がされない。
また、エラーが表示されてもマクロの呼び出し部分でのみ表示されるのでデバッグが困難になる。

・危険な定数展開をしてしまうリスクがある。
後で述べるが関数とマクロには呼び出しと置き換えという違いがある。マクロは置き換えなのでintやmainなどの重要な語句も置き換えることができてしまう。そのため重大なエラーにつながりやすい。

他にも注意すべき点があるが、とにかく覚えておいてほしいのはマクロは重大なエラーの原因になりやすいということだ。

マクロと関数の違い

先ほども述べたが、マクロは文字列置換(置き換え)、関数は呼び出しという違いがある。
次のコードを見て、実行結果を考えてほしい。
 #include <stdio.h>
 #define add_m(x, y) x+y//引数の合計を出すマクロ
 
 int add_f(int x, int y) {//引数の合計を出す関数
 	return x + y;
 };
 
int main() {
	printf("%d\n",add_m(10, 3) * 2);
	printf("%d\n",add_f(10, 3) * 2);
return 0;
}

実行結果は
 16//ここが26になると思った?甘いな。マックスコーヒーのように甘い。
 26
となる。

printf("%d\n",add_m(10, 3) * 2);の部分でadd_m(10, 3)が10+3に置き換わる。
そのため実際にはprintf("%d\n",10 + 3 * 2);と同じ状態になる。
そして、演算子の順番の関係で3*2が先に計算され、次に10 + 6が計算されて16になる。

関数のほうについては、printf("%d\n",add_f(10, 3) * 2);の部分で、add_f(10, 3)で一度関数定義部分に飛んで(呼び出されて)先に10+3が計算される。
そのためprintf("%d", 13*2);と同じような状態になる。

以上のように関数とマクロには呼び出しと置き換えの違いが存在しており、処理結果も変わってくる。

三項演算子

参考演算子ってのがあるんだお!
これ使うとC言語スコーラ第7回あたりの問題のコードとかがすっきりするお!
 条件式? 真のときの値 : 偽のときの値

二つの整数を受け取り大きいほうを返す関数
int Max(int x, int y)
    {
       return ((x >= y)?  x : y)
    }

講師やってると教えてねえのにこれでやってくるやつが結構いるんだよなぁ。
俺は講師になるまでこんなの知らなかったからちゃんとやってて偉いと思うのと、どうやってこれにたどり着いたのかがちょ~気になる。
目安箱バナー