C言語学習log:式と演算子

やさしいC 第3版 』Lesson4は式と演算子です。

式と演算子について

まず、用語の説明ですが、C言語の「式」の多くは、

を組み合わせてつくられていて、「1+2」の場合は、「+」が演算子、「1」と「2」がオペランドにあたります。

式の「評価」という重要な概念があり、「1+2」という式は評価されて3という「式の値」をもちます。単純に足し算ではないかと思うのですが、評価という概念が出てきます。変数の時と同じように、数学的な考え方のままでは他の演算子が出てきたときに理解が難しくなるのかもしれません。

コードはそれほど難しいものではなく、

printf("変換仕様", num1+num2);

で、num1とnum2を足した数値が表示されます。

キーボードから入力した値を計算するには、

scanf("変換仕様", &num1);
scanf("変換仕様", &num2);
printf("変換仕様", num1+num2);

となります。

演算子にはいろいろな種類があり、オペランドを1つとるもの、2つとるものなどがあります。オペランドを1つとる演算子は、単項演算子と呼ばれることもあります。

インクリメント・デクリメントと演算子

インクリメント演算子(++)・デクリメント演算子(--)という演算子があり。「インクリメント」とは、変数の値を1増やす演算のこと、「デクリメント」とは変数の値を1減らす演算のことです。

「a++;」は「a = a + 1;」と「b--;」は「b = b - 1;」と同じ処理になります。

また、インクリメント・デクリメントの前置と後置があり、

  • 前置インクリメント演算子は、インクリメントしてから代入する。
  • 後置インクリメント演算子は、代入してからインクリメントする。

という処理が行われます。

代入演算子

代入演算子は、「=」という記号のことですが、「等しい」(イコール)という意味ではなく、

左辺の変数に右辺の値を代入する

という機能をもつ演算子です。

代入演算子は = だけではなく、=と他の演算を組み合わせたバリエーション(複合的な代入演算子)もあります。

a += b;

は、

変数aの値に変数bを足し算し、その値を変数aに代入する。

という演算を行います。

sizeof演算子

sizeof演算子を使うと、いろいろな方や式のサイズを調べることができます。

printf("%dバイト\n", sizeof(short int));
printf("%dバイトn", sizeof(a+b));

で、型や式のサイズを表示することができます。

シフト演算子

シフト演算子は、<<や>>という記号で示され、

数値を2進数で表した場合のケタを、左または右に指定数だけずらす(シフトする)

という演算のことです。

演算子の優先順位

演算子の優先順位について、加減乗除やカッコは数学的な考え方で問題ないようです。

同じレベルの優先順位の演算子が同時に使われた場合は、左結合と右結合という演算の順序があり、左結合的な演算子(例えば「*」「/」「+」「-」)は左から評価され、右結合的な演算子(例えば「=」)は右から評価されます。

型変換

一般的にC言語では、

大きなサイズの型の変数に小さなサイズの型の値を代入する

ことができます。

逆に、小さなサイズの型の変数に大きなサイズの型の値を代入すると、値の一部が失われてしまう場合があるので注意が必要です。

なお、下記のようなキャスト演算子を使って、型を変換することをコードの中に明示的に書いておくことができます。

(型) 式

これは、指定した式の型を( )中で指定した型に変換するという演算を行うものです。

演算子に異なる型のオペランドを記述した場合は、

一方のオペランドを大きなサイズの方に型変換してから演算を行う

という決まりになっています。

まだ、Lesson4だというのにだいぶボリュームが出てきました。iPhoneアプリ開発の入門書を読んでいてよくわからなかった「引数」や「戻り値」はLesson8ですので、まだまだ先は長いです。