代入
a=13;
と書くと、aという変数名がついた箱の中に13という値が記録される。C言語と数学の違うところは、式文の最後に「;」をつけることと、変数の型を意識しなければいけない点である。
キャスト
キャストは、変数もしくは定数の前につけることで型の変換を行う。
(型)変数 (型)定数
例えば、(int)nと書くと、nはその場だけ整数型になる。
型変換を伴う代入の問題点
小さな幅の型から大きな幅の型に代入するのは問題ないが、大きな型から小さな型へ代入する場合は、まったく異なる数値に変化する可能性がある。また、符号付きと符号なしの変数どうしでも値が変わるおそれがある。
練習問題3.1 値の入れ替え
代入を使って、変数aとbの内容を壊さずに、入れ替えるプログラムを完成せよ。ただし、変数aとb以外に作業用として変数wを用いることとする。
#include <stdio.h>
void main(void)
{
int a,b,w;
a=10;
b=20;
printf(“\na=%d”,a);
printf(“\nb=%d”,b);
/*入れ替え*/
(ア) |
(イ) |
(ウ) |
printf(“\na=%d”,a);
printf(“\nb=%d”,b);
}
<実行結果> a=10 b=20 a=20 b=10 |
解答 (ア)w = a; (イ)a = b; (ウ)b = w; |
解説 変数wにaの値を入れる。この段階で変数aにはaの値が入っている。次に、変数aに変数bの値を入れる。最後に変数bにwの値を入れる。この結果aにはbの値、bにはaの値が入ることになる。プログラムの基本なので身に付けよう。
例題3.1 キーボードからの入力
キーボードからの入力(標準入力)を取り込むのに便利なものに、scanfという関数がある。例えば、コマンドプロンプト上で自分の名前を打ち込んだら次の行に”こんにちは誰々さん”と表示するプログラムを考えてみよう。ちょっと難しい。
実行例
考え方
キーボードから入力した文字列を保存するには、配列name[ ]を用いる。この段階では配列が何か分からない人が殆どあるが、文字列は配列に入れるんだと理解すればよい。また、取り込むときに、配列名nameの前に&は付けない。詳しい説明は6章および8章を参照のこと では、プログラムを書いてみよう。
解答
#include <stdio.h> int main() { char name[8]; /*name[8]はnameという箱に8つの文字を入れる場所を確保*/ printf(“名前はなんですか
?\n”); scanf(“%s”, name); //この場合は&を書かない。 printf(“こんにちは%sさん”,name); } |
この例題では、名前をコマンドラインから入力した。それに対して、次の例題では表示させるものをコマンドライン引数として使う。
Cのmain関数はmain(int argc, char *argv[])と書け、最初のint argcは引数の個数を表し、char *argv[]は引数となる文字列を意味する。第1引数はargv[1]となる。
例題3.2 コマンドライン引数
自分の名前を引数として打ち込んだら次の行に”こんにちは誰々さん”と表示するプログラムを考えてみよう。
実行例
考え方
main(int args, char *argv[])において第1引数、横田は、argv[1]に代入される。では、プログラムを書いてみよう。
解答
#include <stdio.h> void main(int argc, char *argv[]) { printf(“こんにちは%sさん”,argv[1]); } |
argv[0]には、このプログラムのディレクトリが入る。
scanfの書式
scanfの書式制御文字一覧
名称 |
文字 |
意味 |
備考 |
負記号 |
― |
左詰めを指定 |
省略可 |
出力幅1 |
整数 |
文字列の桁数の最小値を指定 |
省略可 |
出力幅2 |
整数 |
浮動小数点の場合には小数点以下の桁数 |
省略可 |
修飾子 |
h |
引数の型d,i,o,u,xを修飾し引数がshort型 |
省略不可 |
l |
型d,i,o,u,xを修飾し引数がlong型 |
||
l |
型e,f,gを修飾し引数がdouble型 |
||
L |
型e,f,gを修飾し引数がlong double型 |
||
引数の型 |
d,i,o,x |
10進数、10進数、8進数、16進数 |
省略不可 |
u |
符号なし10進数 |
||
c |
1文字 |
||
s |
文字列および文字配列 |
||
e,f,g |
浮動小数点 |
||
p |
ポインタ値 |
キャッチ scanfを用いるときによく起きるエラーは引数の前に&を忘れることである。ただし、引数が配列の場合は&を付けない。詳しいことはポインタの章で説明する。引数の前の&はアドレスを意味しており、初学者には分かりづらいので、CのバイブルR&Kの本ではgetcharを用いている。1文字づつ文の最後まで読み込むには int c; while(c = getchar( ) != EOF) と書けばよい。EOFはend of fileの略である。 |
練習問題3.2 次のプログラムで、出力時に値が変化する可能性があるのはどれか。
1 #include <stdio.h>
2 void main(void)
3 {
4 int i,j;
5 long l;
6 float f;
7 double d;
8 scanf(“%d”,&i);
9 scanf(“%ld”,&l);
10 scanf(“%f”,&f);
11 scanf(“%lf”,&d);
12 j=1;
13 i=(int)l;
14 l=(long)f;
15 f=(float)l;
16 l=(long)i;
17 i=j;
18 printf(“%d %ld %f”,i,l,f);
19 }
20
解答 long型のlは、13行目でint型のiに強制変換して代入された後、16行目でlong型に戻されるが、13行目で桁数が落ちる可能性がある。float型のfは、14行目でlong型のlに強制変換して代入された後、15行目でfloat型に戻されるが、14行目で小数部分が落ちる可能性がある。
練習問題3.3 次のプログラムを実行した結果を数値で答えよ。
<プログラム>
#include <stdio.h>
void main(void)
{
int a,b;
a=9;
b=2;
printf(“a/bの結果=%d\n”,a/b); /*整数どうしの割り算を行うと、結果は整数で表
される。*/
printf(“a%%bの結果=%d\n”,a%b); /* a%bはaをbで割ったあまりを出す*./
}
解答 a/bの結果=4、a%bの結果=1
a,bがint型のとき、a/bは整数の商を表す。a%bはあまりを表す。