プログラミング C 04 - Soft Forum P.C. Club

算術演算

数値リテラルと変数がわかれば, 簡単に算術演算ができます.

演算子効果
+足す
-引く
*掛ける
/割る
%余り
#include <stdio.h>
int main(int argc, char **argv) {
  int i = 10, i2 = 20;
  printf("i  *  i2 = %d\n"
         "0.1 * 10 = %f\n", i * i2, 0.1 * 10);
  return 0;
}

0.1 * 10の計算のformat指定子に%fを使っています. これは浮動点少数を表示するものです. さて, 0.1はfloatですが, 10はintですね.

このとき, intとfloatを掛けるわけですが, 一般にfloatの方が表現できる値が広いです. このため, この広い方に片方が変換されてから計算されます.

このとき, 10は一度floatに変換されて, それから掛け, その結果はfloatになります. これを通常の算術型変換といいます. 型intからfloatに変わっているわけです.

また, 単項演算子というものがあります. まあ馴染み深い物ですが...

#include <stdio.h>
int main(int argc, char **argv) {
  int i = 10, i2;
  i2 = -i;
  return 0;
}

-をつけて負の数にしています. この-が単項演算子の-です. もちろん+もあります.

入力(input)

さて, IOという言葉が時折でます. これはInput and Output, 入力と出力です. printfによって端末への出力をやりましたので, 端末からの入力をやりましょう. これによって, ついに外部からのデータを読み込む形式のプログラムを書くことができます.

getchar/putchar

まず, getchar / putcharをやります.

man 3 getchar

などとすると, manualが出たりします. (ちなみに3というのはsectionです. 3はC言語ライブラリコールのsectionです. ここらへんはman manとするとmanのmanualがでます)

getchar, putcharの関数プロトタイプは以下です.

int getchar(void);
int putchar(int);

getcharは引数なし(void)で, intを返す関数であることを示します.

putcharは引数に文字を表すintを入れて, intを返す関数であることを示します.

以下のように使用します.

#include <stdio.h>

int main(int argc, char **argv) {
  int ch;
  ch = getchar();
  putchar(ch);
  return 0;
}

getcharで文字を1字読み込みます. そしてputcharで表示します.

ちなみに, 文字はcharだったのになぜintで表しているのかという話があります. int は4byteでcharは1byteですから, データ量でintで足りないということはないです. ではなぜか.

intは符号, つまり負数を持っているという話をしました. これはcharのデータ上ではありません. getcharは文字を返しますが, エラー処理も行う場合があります. つまり, ある値が返ってきたらエラーだったというように扱いたいわけです. この際, 負数というのは非常に便利です. なぜならどの文字ともかぶる可能性がないからです.

このため文字以外を返す可能性のある関数がintを返すというのは定石の一つとなっています.

scanf

scanfをやります. これは入力をscanし, formatどおりに解釈するという関数です.

man 3 scanf

で詳細を見ることができます. このようにmanualの引き方を覚えていると, format文字とかを必死で覚える必要がなくなったり, 忘れてもすぐに見つけることができるので便利です.

#include <stdio.h>

int main(int argc, char **argv) {
  int d;
  scanf("%d", &d);
  printf("%d\n", d);
  return 0;
}

まず, 変数を宣言しています. こうしてこれから取ってくる値のための箱を作っておく必要があるわけです.

scanfの第一引数はformat文字列です. これはprintfのものと酷似していますが, ちょこちょこ違うのでmanを見てもらえれば.

この場合は入力を10進の数値とみなして, その値と解釈できる値をdに代入しています.

注意してもらいたいのは, dの前に&の記号のついているところです. K&Rでも

非常に多いエラーは scanf("%d", &n); と書かずに, 次のような書き方をすることである。 scanf("%d", n); このエラーはコンパイル時には通常検出されない。

と注意書きがされています. &の記号はアドレス演算子と呼ばれるもので, これの解説はかなり後になりますが, データ実態へのアドレスをデータのポインタ型として返すという今の時点では非常に意味不明な解説しかできません.

さて, これで情報工学科のプログラミング演習2回分を直走ってきました. ちょこちょこ個人的な「知ってると便利!」な知識が入っていますが, これで一段落です.

Soft Forum P.C. Club