320 likes | 409 Views
プログラミング演習 初級コース:講義3回目. 演算子. 習得すること. 演算子の種類 算術演算子 インクリメント,デクリメント ビット操作 比較、論理演算子 演算子の優先順位と結合規則 データプライバシー スコープと記憶クラス. C言語で使える演算子. C言語の演算子の種類 算術演算子 (+,++,+= 等 ) 論理演算子 (<,==,&&,! 等 ) ビット演算子 (<<,&,&= 等 ) その他の演算子 (( 型 ), ? : 等 ) 機械語(命令)に直しやすい演算のみが 用意されている 複雑な演算(べき乗など)は関数で用意.
E N D
習得すること • 演算子の種類 • 算術演算子 • インクリメント,デクリメント • ビット操作 • 比較、論理演算子 • 演算子の優先順位と結合規則 • データプライバシー • スコープと記憶クラス
C言語で使える演算子 • C言語の演算子の種類 • 算術演算子 (+,++,+=等) • 論理演算子 (<,==,&&,!等) • ビット演算子 (<<,&,&=等) • その他の演算子 ((型), ? :等) • 機械語(命令)に直しやすい演算のみが用意されている • 複雑な演算(べき乗など)は関数で用意
算術演算子 • 算術演算に使われる演算子 • 一般的な加減乗除のほかにも便利な演算子がある • 二項演算子(+,-,*,/,%)に対して代入演算子(+=,-=,*=,%=)がある
算術演算子(二項演算) 注意: 整数の除算の結果は切り捨て 浮動小数点の剰余算はエラー 原則として演算結果のオーバーフローは検出しない
算術演算子(単項演算) • C言語の特徴の一つ • インクリメントとデクリメントは前付と後付がある a = b++; bの値がaに代入され,その後bに1を加える a = ++b; bに1を加え,その結果がaに代入される
論理演算子 • 真または偽という論理判定の結果を返す • 真ならば0以外の値(-1か1がほとんど, Sunでは1) • 偽ならば0 • 主に制御文の条件として用いられる • 関係演算子(<,==,!=等) • 大小関係を評価する演算子 • 関係が成立していれば真,そうでなければ偽を返す • 論理(積和)演算子(&&,||,!) • 論理(積和)演算を行う演算子
論理演算子(論理演算) 注意: ビット演算子と(&,|,^,~)と間違わないように 排他的論理輪(XOR)はない
ビット演算子 • 変数の各ビットを直接扱う演算子 • char型は8ビット,long int型は32ビットで扱う • シフト演算子(<<,>>) • ビットを右や左にシフトする演算子 • 1ビット左(右)シフトは2倍(1/2倍)などを行うことと同意 • 符号付きのデータかそうでないかで結果が変わる • ビット(積和)演算子(&,|,^,~) • ビットごとにAND等を行う演算子 • 代入演算子もある • <<=,>>=,&=,|=,^=
ビット演算子(シフト演算) 注意: 整数型でのみ使用できる 右にシフトを行う場合は符号に注意 符号付きで宣言されたデータ: 空いたビットに符号と同じ値が入り(算術シフト) 符号なしで宣言されたデータ(unsigned): 空いたビットに0が入る(論理シフト)
ビット演算子(ビット毎の論理演算) 注意: 論理演算子と(&&,||,!)と異なる
その他の演算子 • 括弧(結合) ( () ) • 条件演算子(三項演算子) (?:) • コンマ演算子(順次演算子) ( , ) • キャスト演算子,sizeof演算子 ((型),siziof()) • 配列演算子 ([]) 第6回講義:配列で詳しく説明 • アドレス演算子,ポインタ演算子 (&,*) 第7回講義:ポインタで説明 • 構造体メンバー演算子 (.,->) 第9回講義:構造体で説明
条件演算子(三項演算子) • 条件付きの演算を簡潔に記述することが可能 if (a>0) i = a*b; else i = a+b; i = a>0 ? a*b : a+b;
コンマ演算子(順次演算子) • コンマで区切られた順に左から実行 • 演算の課程を簡潔に表記したり,for文などで2つの実行文を続けて書きたい場合に使用する
キャスト演算子,sizeof演算子 • キャスト演算子: (データ型)式 • 強制的にデータ型を変換 • 例: (int)3.14 は3になる • sizeof演算子: sizeof(型または式) • 型や式の使用するメモリサイズをバイト単位で返す • 構造体や共用体が使用するメモリサイズを調べることも可能 • 例:sizeof(256*3)とsizeof(int)はSunの場合は4
配列演算子 • a[3] • 配列 • データを一定の規則にしたがって並べたもの • 例えば int a[10]; と宣言するとint型の変数がa[0]からa[9] の10個分用意される • 定義方法: 型(int等) 変数名[定数式(3*3等)]; • 参照方法: 変数名[式] • 詳しくは第6回講義で
演算子の優先順位と結合規則 • C言語の演算子には優先順位と結合規則あり • 演算の順序が決まる • 例1:a=b+c; • =と+では+の方が優先順位が高い • a=(b+c); • 例2:a=b=c=d=0; • 代入演算子は結合規則により右から左 • a=(b=(c=(d=0))); • 右の=から演算され,a,b,c,dに0が代入される
演算子の優先順位と結合規則 • 例3:a=b+c+d; • =と+では+の方が優先順位が高い • 2項演算子は結合規則により左から右 • a=((b+c)+d); • 例4:a>b||c==d&&e<f; • 比較>等価>論理AND>論理OR • (a>b)||((c==d)&&(e<f));
演算子の優先順位と結合規則 • 例5:a=~b<<2; • a=((~b)<<2); • 例6:a<<4>>2<<3; • 結合規則により左から右 • (((a<<4)>>2)<<3);
データ型と使用メモリサイズ • char sizeof(char)==1 • int sizeof(int)==4 • short int または short sizeof(short)==2 • long int または long sizeof(long)==4 • unsigned int等 サイズはsignedと同じ • float sizeof(float)==4 • double sizeof(double)==8 • (long long) sizeof(long long)==8
数の表現方法 • 10進数(整数型) • 105等 • 8進数 • 0で始まる:0377等 • 16進数 • 0xで始まる:0x7fffなど • 浮動小数点型(10進数) • 数字の中に小数点(.)がある • 指数表現もできる • 12.345.12345e212345.0e-3
データプライバシー • スコープ:変数の有効範囲 • 有効範囲を限定することで • プログラムのモジュール化 • デバッグの容易化
スコープを理解する • 変数の有効範囲 • 通常,ブロック{...}の中で宣言した変数はそのブロック内でのみ有効 {int a,b; a = b = 1; {int b,c; a = b = c = 2; /* a:2 b:2 c:2 */ } /* a:2 b:1 */} aとbのスコープ bとcのスコープ外側のbは見えなくなる
スコープの単位 • プログラム全体 (大域) • モジュール(コンパイルの単位) • 関数 • 複合文(ブロック)({...}で囲まれた文の列)
記憶クラス • 有効範囲を意識した変数定義 • 自動変数(auto) • レジスタ変数(register) • 静的変数(static) • 外部変数(extern) • 使用方法: • static int a; register int a; extern int a;など
記憶クラス • 自動変数(auto) • スコープから抜けると"automatically"に値を失う • 何も指定しない定義はauto • レジスタ変数(register) • レジスタ上に確保(速い) • レジスタが空いていなければautoといっしょ • 使用可能なレジスタ数以上定義するのは無意味 • レジスタに置けるデータ型でなければならない • アドレス演算子を使えない • スコープから抜けると値は失われる
記憶クラス • 静的変数(static) • スコープから抜けても値が消えない • 戻ると前に抜けた時点の値を利用できる • 外部参照(extern) • 大域変数を定義したファイルとは別のファイルで参照する場合の宣言に用いる
まとめ • 演算子の種類 • 算術演算子 • インクリメント,デクリメント • ビット操作 • 比較、論理演算子 • 演算子の優先順位と結合規則 • データプライバシー • スコープと記憶クラス