[前回] 構文 代入文 構文 : 変数名 = 式 意味 : 「式」の値を計算して、その結果を「変数名」が表す変数に「代入」する 代入 : 変数の値を変更する 以前にもっていた変数値は、「変数の値」でなくなる 代入後は、代入された値が、「変数の値」になる cf. 変数:変数名で、変数の値を参照(取り出す)仕組み => 関数の仮引数変数:(これまでは)値が一度設定されると、それ以後は変化しなかった(パラメータ) 「代入」の機能は、関数の仮引数変数に対して、関数呼び出しをする時に働いていた # 「代入文」インパクト # 代入文の前と後では、「同じ表現の結果が変わる」 # 代入は基本的な機能 : 使い分けが難しい # 自由に使うのではなく、制限して使うと協力かつ安全 # cf. 関数の仮引数変数への実引数値の代入は、制限された代入の例で、安全かつ強力 ## C 言語の設計思想 ## 危ないけど強力な機能を、シンプルに提供する(実行効率を高める) ## => 使いこなしは、プログラマの技量に任せる 変数宣言 構文 : 型名 変数名 意味 : その「型名」の表す型を持つ変数を用意し、「変数名」の名前を付ける => 新しい変数作られる # cf. 関数の仮引数宣言 : 制限された変数宣言 # 関数の仮引数変数は、関数呼び出しの実引数の値で初期化されている # 変数宣言は、ブロック 「{ 〜 } の間」の先頭でのみ、行われ # その変数の有効(スコープ)は、そのブロック内のみである # 例外: 関数の仮引数変数は、関数のヘッド部(引数の所)に # 記載されるが、その有効範囲は、ボディ部({ 〜 } の間)になる # => 関数の仮引数変数のスコープは、関数内全域になる 「変数」と「代入」を多用する理由 => いったん計算した結果を、変数に代入して、使いまわす => 同じ計算を回避できるので、効率的になる == printf の正体 前回以前 : printf は引数に文字列を指定して、その文字列を画面に表示する => 文字列表示専用の関数 # cf 文字列以外の出力 s_print_aaaa を使え.. 実は、printf は出力の万能選手で、いろいろな型の値を出力できる 構文 : printf ( 書式文字列, 必要に応じて追加の値 ) 意味 : 基本は書式文字列を画面に出力するが、 その文字列の中の書式指定(%から始まる)があると、 その部分に、指定された型で、追加された値を、順に当てはめて出力をする 具体的な例 printf ( "x=%d\n", 1+2+3 ); x=6<改行> /* %d が 6 に置き換わる */ cf. C 言語には、文字列を出力する puts がある => Hello World では puts でもかまわなかった にも拘わらず、printf を使っている => K&R は、printfを自慢したかった可能性がある !! printf は非常に強力 printf はすごく変 引数の個数がかわったり、 引数の型がかわったりする # 「printf の原理」=> 時間があれば、説明したい 1. printf という大変便利なものがあるので活用しよう # cf. s_print.h よ、おさらば 2. 1. にも拘わらず、printf は注意深く利用する必要がある [今日の話] printf : 出力 <-> 入力 : scanf scanf : さらに注意が必要 => 詳しくは、また後回し 構文 : scanf ( 書式, &をつけた変数(名)を並べる ) 意味 : 「書式」で指定した型の値をキーボードから入力し、 そのあとの引数で指定した変数に代入する !!!! 実は、「嘘」だが、そのようにまず理解してお while 構文 構文 : while ( 条件 ) { 命令 } 意味 : 「条件」が成立している限り「命令」を繰り返す cf. 繰り返しを行う構文 (これまでは、再帰呼び出して実現) => 関数を作らずに「繰り返し」が実現できる [ポイント] 「命令」を実行すると、「条件」が変化する可能性がある必要がある ふつうは、条件に変数を入れて、命令の中でその変数の値を代入を利用して、変化させる # cf. while 文は、いつでも、形式的に再帰関数に変換できる # while ( 条件 ) { 命令; 変数の変更 } # 例 : 条件 ( n <= 10 ) / 命令 : printf () / 変数の変更 n = n + 1 # # while( 変数:代入文の左 ) { # if ( 条件 ) { # 命令 # fwhile ( 代入文の右 ); # } else {} # }