sum=sum+a[i];
は次のように書くことができる。
sum+=a[i];
これは足し算だけでなく、引き算、かけ算、割り算なども同様である。
i-=2; x*=3; y/=2;
また、特に 1 増やす書き方、減らす書き方 は次のように書ける。
i+=1; i++; ++i; i-=1; i--; --i;
従って、以前取り上げた和を求めるプログラムは次のように書ける。
#include <stdio.h> #define ASIZE 10 main(){ int a[ASIZE]={4,5,3,1,7,8,9,2,0,6}; int i,sum; sum=0; for(i=0;i<ASIZE;i++) { sum+=a[i]; } printf("Sum=%d\n",sum); }
また、式自体も値を持つ。
x=0;
という式自体、 0 という値を持つので、
y=(x=0);
で、 y にも x にも 0 が代入される。
#include <stdio.h> main() { int i,sum; sum=0; for(i=0;i<50;i=i+1){ sum=sum+i; } printf("%d\n",sum); }
i++
と++i
は意味が違う。
これを調べるため、プログラムを書いて確かめてみた。
次の問いに答えなさい。
i++
と++i
の違いを説明しなさい。
#include <stdio.h> main() { int i,j; i=0; j=(i=i+1); printf("i=%d, j=%d\n",i,j); j=(i+=1); printf("i=%d, j=%d\n",i,j); j=(i++); printf("i=%d, j=%d\n",i,j); j=(++i); printf("i=%d, j=%d\n",i,j); }
if 文の基本構文は次の通りである。
if(条件){ 文1 }else{ 文2 }
二つの条件,「条件1」,「条件2」があり、「条件1」が成立しないとき、「条件2」を調べたい時、基本的には次のように書く。
if(条件1){ 文1 }else{ if(条件2){ 文2 }else{ 文3 } }
これを次のようにも書ける。(但し、構文的な誤りを犯しやすいので、十分注意して使うこと)
if(条件1){ 文1 }else if(条件2){ 文2 }else{ 文3 }
#include <stdio.h> main() { char a[]="100101"; int i,x; x=0; for(i=0;a[i]!='\0';i++){ if(a[i]=='0'){ x*=2; }else{ if(a[i]=='1'){ x=x*2+1; } } } printf("%s(2) = %d(10)\n",a,x); }
UNIX や MS-DOS には標準入力、標準出力という特別なファイルが提供されている。
標準入力は通常はキーボードの入力であるが、他のファイルも指定できる。
また標準出力は通常は画面であるが、これも他のファイルを指定できる。
MS-DOS では標準入出力は CON
というファイル名で参照できる。
標準入出力を変更することで、コマンドの入力にファイルを使用したり、コマンドの出力をファイルに保存したりできる。
コマンド > 標準出力の変更先
コマンド < 標準入力とするファイル名
コマンド1 | コマンド2
printf は標準出力に文字を書く関数である。 (stdio は「standard input/output」の意味。.h はヘッダファイルを区別するために付けられる)
以前作った hello.c を再度コンパイルする。
/* hello.c */ #include <stdio.h> main(){ printf("Hello, World!\n"); }
abc
にHello, World!
を出力する。
(type abcで確認せよ)
getchar()
putchar(c)
getchar()
はファイルの終りを検出するとEOF
という特殊な文字を読む
ファイルの内容をそのまま出力するプログラム
#include <stdio.h> main() { char c; c=getchar(); while(c!=EOF) { putchar(c); c=getchar(); } }
但し、C 言語風の書き方をするとこうなる(この書き方の理解は重要である)
#include <stdio.h> main() { char c; while((c=getchar())!=EOF) { putchar(c); } }
上記のプログラムの名前をex10-1.c
とする。
abc(Enter) def(Enter) Ctrl-Z(Enter)(Ctrl ボタンを押しながら、Z を押す)
a.exe < ex10-1.c
テキストファイルを行ごとに処理したい時、「\n」で行の終りを判断する。
#include <stdio.h> #define TRUE 1 #define BUFSIZE 1000 main() { char line[BUFSIZE]; int i; i=0; while(TRUE){ /* 無条件に繰り返す方法 */ line[i]=getchar(); if(line[i]=='\n'){ line[i]='\0'; printf("%s\n",line); i=0; }else if(line[i]==EOF){ line[i]='\0'; printf("%s\n",line); return; /* プログラムを終了させるコマンド */ }else{ i++; } } }
「行を読む」という部分をひとまとまりにして流れを考える。 また配列変数が終ったら、それ以上配列にセットしない。
#include <stdio.h> #define BUFSIZE 1000 main() { char c; char line[BUFSIZE]; int i; do{ /* do{ 文 } while(条件); に関しては後述 */ i=0; c=getchar(); while((c!=EOF)&&(c!='\n')){ if(i<BUFSIZE-1){ line[i++]=c; /* line[i] に c を入れた後、 i を一つ増やす */ } c=getchar(); } line[i]='\0'; /* 行の最後に文字列の終りの文字を入れる */ printf("%s\n",line); }while(c!=EOF); }
do{文}while(条件); と while(条件){文} の違い
while(条件){ 文 }は「条件」が一回も成り立たなければ、「文」は一回も実行されない。do{ 文 while(条件);は初めに「文」が実行された後、「条件」が調べられ、成り立っていたら再度「文」を実行する。 「条件」が一回も成り立たなくても、「文」は一回は実行される。