計算機実習 I

第三回 (2005年 4月28日)

演算子の種類、使い方、優先度

AGU

© 2005 Martin J. Dürst 青山学院大学

目次

先週の補習

ミニテスト:
[良くあった間違いの説明]
derived type (修正):
「導出」データ型 → 派生型
関数型を追加

授業のありかた

演算子

演算子の種類

演算子とデータ型

演算子の項の数

同形多義の演算子や記号

演算子の優先度

式に括弧がないところは演算子の優先度 (priority) の高いものから計算される

各演算子の優先度は付録 2.1 に参照

順序は一般的に括弧を少なめに使ってもいいようにできている
for (i=0; i<max-1 && (c=getchar()) != '\n' && c != EOF; ++i)

== と != は <, >, <=, >= より優先度が低い
if (a1 < a2 == b1 < b2)

但し、はまるところもある
c = a<<8 + b
/* a << (8+b) ! */

演算子の連結規則

C の殆どの演算子は左から右に連結する

右から左に連結するのは次の演算子である:

連結規則 (assoicativity) が数学的に影響がないときにもプログラムの結果に影響がある時がある

i = 4 * 5 / 3; /* integer division */

副作用

式の評価

プリプロセッサによるマクロ

単純な置き換え:
#define ARRAYSIZE 20

関数型マクロ (優先度のための括弧に注意):
#define MAX(A,B) ((A)>(B)?(A):(B))

型に関係ないので便利; しかし副作用に注意:
MAX(getchar(),x)
((getchar())>(x)?(getchar()):(x))

文字列化の機能:
#define PRI(i) (printf(#i " = %d\n", (i)))

PRI(a+b)
(printf("a+b" " = %d\n", (a+b)))

今週の演習の補足

次回の準備