• ベストアンサー

C言語

/*test1*/ main() { static int data[] = {1,2,3,4,5,6,7,8,9}; int i,ct = 0; i = 2; while(i < 8){ ct += data[i]; i++; } printf("%d",ct); } /*test2*/ main() { int i = 0, j =0, ct = 0; while(i < 5) ct = ct + (++i) + (j++); printf("%d",ct); } 上記のプログラムで、test1は33、test2は25という実行結果になります。私が分からないのは、test1のwhile(i < 8)ではdata[7]まで数え、test2のwhile(i < 5)ではiが5になるまで数える事です。問題集をやっていて疑問に思ったのですが解答だけが載っており説明が載っていなかったので質問しました。理解されてるかたには簡単すぎる質問ですがよろしくお願いします。

noname#100914
noname#100914

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.4

 単項演算子++と--には、「前置」と「後置」という使い方が存在します。  前置とは「++i」のように変数の前につける方法で、式全体を評価する前に変数の値を変化させます。  また、後置とは「i++」のように変数の後ろにつける方法で、式全体を評価した後に変数の値を変化させます。  つまり、    i = 0;    a = ++i;    printf("a=%d, i=%d\n", a, i); の結果は「a=1, i=1」となり、    i = 0;    a = i++;    printf("a=%d, i=%d\n", a, i); の結果は「a=0, i=1」となります。  ただし、1つの式の中で、1つの変数の値を2回変更するような記述をしてはいけません。つまり、    a = (i++) * (++i); のような式は、書いてはいけないということです。  なぜなら、このような使い方をした場合の動作はCの仕様では定義されておらず、処理系によって結果が異なる恐れがあるからです。 (処理系に依存したプログラムは移植性に欠け、見つけにくいバグを生み出します。)  ですから、複雑な式の中で++などを行う必要がある場合は、確実に意図した通りに実行されるよう式を分解するのが、バグを防ぐ最良の手段です。

その他の回答 (4)

  • ponnta
  • ベストアンサー率17% (31/179)
回答No.5

ANo3の値がチョッと変なので訂正 ・i<8のチェック時の値   ・ctを求めるときの値 ct  i  j        ct  i  j  計(ct)  0  0  0                0  1  0   1  1  1  1                       1  2  1   4  4  2  2                4  3  2   9  9  3  3                9  4  3   16 16   4  4                       16  5  4   25 25   5  5 <―この時のチェックでループが終わる 以上訂正でしたiとjの増えるタイミングの問題です

  • ponnta
  • ベストアンサー率17% (31/179)
回答No.3

まずtest1ですが iは8までカウントされています。 プログラムの流れとして  ・i<8のチェック  ・ctの計算  ・iを増やす の繰り返しです iが8になったときは先頭のチェックではじかれるため ctの計算は通らなくなるので実質data[0]~data[7]の 和が作成されます test2の時の3つの変数の変化はctを計算しているときに ct i j  0 0 0  0 1 0  1 2 1  4 3 2  9 4 3 * 16 5 4 iとjの増えるタイミングに注意してください 式中の ++i は式の計算よりもインクリメントが優先されます 逆に  j-- は式の計算に使われた後でインクリメントされます。 test1もtest2もiは比較してる数値まで増えているのですが 増えるタイミングによってそのように見えているのです  

  • yanmaa
  • ベストアンサー率45% (207/457)
回答No.2

++i と j++ では計算順序が異なるのでね test2の ct = ct + (++i) + (j++) の場合 ++iを計算してctに足すけど j++はctにjの値を足してからjに値を+1してるのですよ。 だから iの値は1,2,3,4,5と言う値をctに足し jの値は0,1,2,3,4と言う値をctに足しているから25という答えになるのです。 test1は配列の最初の値はdata[0]に入っているからですね 足す値は3,4,5,6,7,8で33という答えです。 最近Cを使っていないの間違ってたらすまんです。

noname#628
noname#628
回答No.1

それは一言で言ってしまうと、 「i++」と「++i」の差です。 i++は、その数値を参照してから1加えてるのに 対し、 ++iは、1を加えたものを参照しているということです。 つまり、Test2のプログラムのiの参照の仕方は、 1,2,3,4,5となり、5で抜けるって感じになる ってことです。 どうでしょうか?後参照にしたのURLを見ていただければ 違いは一目瞭然かと.

参考URL:
http://www.kumei.ne.jp/c_lang/intro/no_11.htm

関連するQ&A

  • C言語

    ファイルデータ(11,22,33,0,44)を読み込んで表示することを5回繰り返すプログラムを作りたいのですが分かりません。 さらに出来ればファイルデータが0でなければ表示し、0を読み込んだら終了するwhile文でのプログラムも教えてください。 途中経過 #include <stdlib.h> #include <stdio.h> int main(void) { int x = 0,i; FILE *infile; infile = fopen ("test.txt", "r"); if(infile == NULL) { fprintf(stderr, "test.txtが開けません\n"); exit(1); } i = 0 while(1){ i++; fscanf(infile, "%d", &x); printf("%d\n", x); if(i = 5)break; } fclose(infile); return 0; } ここまでで実行すると11しか表示されません。 これまでの質問分かるかたどなたか教えてくださいお願いします。

  • c言語 パスカルの三角形

    c言語でパスカルの三角形を出力するプログラムを作りたいのですが、上手くいきません。 何を直せばいいのか教えてください。 #include <stdio.h> #define N 10 int main(void){ int i, j = 1, x, y; int d[N][N]; /* 三角形を作成 */ for (i = 1 ; i < N ; i++){ d[i][0] = 1; while (j <= i - 1){ d[i][j] = d[i-1][j-1] + d[i-1][j]; j ++; } } /* 三角形の表示 */ for (y = 0; y < N; y++) { for (x = 0; x < N-y; x++) printf(" "); for (x = 0; x < y; x++) printf("%3d ", d[x][y]); printf("\n"); } return 0; } 実行結果 -2147417616 2665208 1629976532 1627572249 1629101723 1 1629982744 2665256 2665548 3407923 1629345053 1627571017 0 3538997 1629739051 10 1629345053 2665368 3670071 2665384 1629739040 1627927140 2665244 1628040295 57 1628810863 1629476960 1628602749 2665560 2665304 1629345053 0 1629739040 1629740576 1628992224 2 4411498 1628040588 -2147417600 0 1629476960 1629740664 1629739040 1 267574 0

  • C言語の問題で困っています。

    C言語の問題で困っています。 誰か教えてください。 下の問題ですが、intがiだけでプログラムするにはどうしたら良いでしょうか? (a)から(d)に入るプログラムをすいませんが教えてください。 お願いします。 【問題】 1以上10以下の整数を昇順に区切って表示するプログラムです。 実行例 1 2 3 4 5 #include <stdio.h> int main (void) { int i; (A) while ((b)){ (c); (d); } printf("¥n"); return(0); }

  • C言語がゎからなくて困ってます;;

    <プログラム(1)> #include <stdio.h> int main() { int i; char a[]="Simulation", *po; po=a; while(*po!='\0') { po++; i++; } printf("The Number of \"Simulation\" is %d\n", i); } <実行結果> The Number of "Simulation" is 10 <プログラム(2)> #include <stdio.h> int main() { int i,j = 0; char a[]="Faculty of Industrial Science and Technology", *po; po=a; while(*po!='\0') { if(*po <= 'z' && *po >= 'a') i++; if(*po <= 'Z' && *po >= 'A') j++; po++; } printf("\"Faculty of Industrial Science and Technology\" contains %d small letters.\n", i); printf("\"Faculty of Industrial Science and Technology\" contains %d capital letters.\n", j); } <実行結果> "Faculty of Industrial Science and Technology" contains 35 small letters. "Faculty of Industrial Science and Technology" contains 4 capital letters. 学校の宿題でプログラムを作ったんですけど、 プログラム(1)ではi=0と書ぃてぃないのにきちんと文字数のカウントが できるのに、プログラム(2)ではi,j=0と書かなければうまくいきませんでした。でもその理由がわからなくて困ってます↓↓ 誰か教えてくださぃ!! 教えてください。

  • C言語について

    問題文が表示され、その解答を数字で入力すると正解の場合は「大正解」、不正解の場合は「はずれ」と表示されるプログラムなのですが、?部分がどうしても分りません・・・ 正しいと思えば0、間違ってると思うなら1と入力するプログラムです。 どなたかご教授いただけるとありがたいです>< main() { int i,k; i=0; while(i<5){ printf("次の文章が正しければ0、間違っていれば1を入力してください。\n"); printf("%s",q[i]); scanf("%d",&k); if(a[?]==?) {printf("大正解\n");} else {printf("はずれ\n");} i????; } printf("おしまい\n"); }

  • C言語をお願いします

    何が違うのか教えてください。 segmentation faultになります。 よく分からないので、プログラムを作っていただければ、助かります。 問 整数を入力し、降順並び変えてに表示。 ・入力した整数は配列に入れ、その配列を使って並び変える(入力終りの印は 1000 とする)。 ・入力する整数の個数は #define NUM 100 を使いなさい。 ・使うデータは、下記の例のように、キーボードから入力すること。 #include<stdio.h> #define NUM 100 int main(void){ int d[NUM]; int temp; int i,j,n; printf("Input scores.\n"); for(i=0; i<NUM && d[i]!=1000; i++){ scanf("%d",&d[i]); } n = i; for(i = 0; i < n; i++){ for(j = i + 1; j < n;j++){ if(d[j] > d[i]){ temp = d[i]; d[j] = d[i]; d[i] = temp; } } } printf("After sort."); for(i=0; i < n; i++){ printf("%d\n",d[i]); } return 0; } 実行例 Input scores. 60 30 45 90 100 0 1000 After sort. 100 90 60 45 30 0 よろしければ 問2 並び変えをする部分を mysort 関数にしたプログラムを作ってください。 main 関数から mysort 関数には点数の個数と sort 前の配列を渡し、並び変え結果の表示はmain 関数でお願いします。 (問題の意味が分かりません) 関数はさっぱり分かりません。 では、お願い致します。

  • C言語について。

    今、C言語に関する問題をやっているんですが、いまいちわかりません。 その問題というのは↓ ≪問題5 (繰り返し) 例題をもとに、次のような九九の表を出力するプログラムを作成しなさい。  1 2 3 4  5  6  7  8  9  2 4 6 8 10 12 14 16 18  ~(略)                                               ≫ という問題です。それで、その例題というのは↓ ≪例題4 (for文、do while文)  次のプログラムは、入力された整数を一辺とする正方形を出力するプログラムである。動作確認をしなさい。  4       (←入力)  ****  (←出力)  ****  ****  **** /* 正方形 */ #include <stdio.h> void main() {     int hen, i, j;     do{        printf("数字(2~9)を入力してください : ");        scanf("%d", &hen);        if( hen < 2 || hen > 9 )           printf("入力エラーです!\n");     }while( hen < 2 || hen > 9);     for( i = 1 ; i <= hen ; i++)     {         for( j = 1 ; j <= hen ; j++)           printf("*");         putchar('\n');    } }  ≫ ≪例題5 (for文、do while文) 次のプログラムは、入力された整数を一辺とする二等辺三角形を出力するプログラムである。動作確認しなさい。  4      (←入力)  *     (←出力)  **  ***  **** /* 二等辺三角形 */ #include <stdio.h> void main() {     int hen, i, j;     do{        printf("数字(2~9)を入力してください : ");        scanf("%d", &hen);        if( hen < 2 || hen > 9 )           printf("入力エラーです!\n");     }while( hen < 2 || hen > 9 );     for( i = 1 ; i <= hen ; i++ )     {            for( j = 1 ; j <= i ; j++ )              printf("*");          putchar('\n');     } }  ≫ 以上の二つが例題です。 わかりづらかったらすみませんm(_ _)m わかる方(問題5を)教えてくださるとありがたいです。

  • C言語 プログラム問題

     すいません、C言語初心者です。以下のプログラムがわからないので、よければ教えてください。 #include<stdio.h> int f(int a); int g(int *a); main(){ int i, j, na =10; int a[12] = {1,2,3,4,5,6,7,8,9,10,11,12}; printf("a = "); for (i=0; i<na; i++); printf("%d ",a[i]); j = f(a[2]); j = f(a[3]); j = g(a+4); j = g(a+5); printf("\na = "); for (i=0;i<na;i++) printf("%d ",a[i]); printf("\nj = %d\n",j); } int f(int a) { static int total=0; total = total + a; a = a+50r; return total; } int g(int *a) { static int total=0; total = total+(*a); (*a) = (*a) +50; return total; } <結果> a = 1 2 3 4 5 6 7 8 9 10 a = 1 2 3 4 55 66 7 8 9 10 j = 11    まず、結果がなぜ下の段に55 56があるのか、そして関数f,gの機能、最後にj=11の意味です。j=5+6 =11とは聞きましたがどこから出ているのかがわかりません。  よろしくお願いします。

  • 配列について(C言語)

    配列の要素において一番目の要素以外を0にするプログラムを以下のように作成したのですが(while文を*b != 0という条件で作りたい)、while文内のところが間違っているためだと思われるのですが、うまく実行されません(実行しても何も表示されない)。どのようにしたらいいのでしょうか。または、何かが抜けている、ほかの部分が間違っている等もあるためにうまく実行されないということなのでしょうか。 #include <stdio.h> int main(void) { int a[5] = {5, 78, 2, 9, 0}; int i, *b; b = &a[0]; while (*b != 0){ if(*!=a[0]) *ptr=0; else *ptr=a[0]; } for (i = 0; i < 5; i++){ printf("ptr値 =%d ptrアドレス =%p \n", *ptr, ptr); } printf("\n"); return (0); }

  • C言語の参照はずしについて

    ソートのプログラムなんですが #include <stdio.h> #include <stdlib.h> int comp(const void *, const void *); int main() { int i; int test[6] = {10, 8, 2, 6, 4, 0}; qsort(test, (size_t)6, sizeof(int), comp); printf("\n"); for (i = 0; i < 6; i++) printf("%d\n", test[i]); return 0; } int comp(const void *a, const void *b) { static int i = 1; printf("%02d--%d,%d\n", i, *(int *)a, *(int *)b); i++; return (*(int *)a - *(int *)b); } 最後のreturnの()の中身がよくわかりません。「参照はずし」という事をしてるらしいんですが「参照はずし」とは何ですか意味も教えてください。

専門家に質問してみよう