• 締切済み

VC++2005EEにて不可解な挙動

int j = 0; for( ; ; ){  printf( "%d ", j ); } printf( "hoge \n" ); 上記コードを無限ループで回したところ、表示されるのは 0の羅列ではなくhogeの羅列でした。 このような状況ってありえるのでしょうか? 環境はVisualC++2005 ExpressEditionです。 また、なぜかコンパイル中に上記のforのところで warning C4127: 条件式が定数です。 という警告が出ていましたがなぜでしょうか。

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★アドバイス >0の羅列ではなくhogeの羅列でした。  ↑  『hoge』が1回表示される理由は分かりますが羅列ですか? ・コンパイラの最適化により for 文の内部にある printf() 行は実行されないことがあります。  このため 0 の羅列が起きないのは分かります。でも『hoge』が1回の表示ではなくて羅列  するのは不思議です。なぜ。 >warning C4127: 条件式が定数です。  これも私の環境では警告メッセージは出ません。私のは VC++2003 です。EE ではない。 ・質問のソースは main() 関数内に記述されているのですか?  それともサブ関数に記述してそれを複数回呼び出しているのですか?  この辺が分かれば『hoge』が羅列する理由も分かる気がします。  もう少し全体像がわかるソースを補足して下さい。 ・以上。

dmq
質問者

お礼

ご回答ありがとうございます。 VisualC++特有のカウンタ変数のスコープ対策でやってた #define for ~ の記述がちょっと変でした。 無事、自己修正できました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ピラミッド表示プログラム。

    ピラミッドを表示させるプログラムを考えています。 例えば3段の場合   *  *** ***** っというような表示です。 #include <stdio.h> void spira(int n); main() { int a; printf("段数は:"); scanf("%d",&a); spira(a); } void spira(int n) { int i,j=1,a,b,k; for(a=n;a>0;a--){ for(b=a-1;b<=n;b--){ printf(" "); } k=(j-1)*2+1; for(i=1;i<=k;i++){ printf("*"); } j++; printf("\n"); } } このように考えてみたのですが、無限ループになって表示できません。 どこが悪いでしょうか? 無限ループの原因はどうやったら解消されるでしょうか?

  • 行列の和のプログラミング

    以下のをCソースを打ち込んでコンパイルすると、 warning: passing arg 1 of `mat_add' from incompatible pointer type warning: passing arg 2 of `mat_add' from incompatible pointer type となります。これは、どういうエラーでどう直せばいいのでしょうか? #include <stdio.h> void mat_add(const int ma[2][3], const int mb[2][3], int mc[2][3]) { int i, j; for (i = 0; i < 2; i++) for (j = 0; j < 3; j++) mc[i][j] = ma[i][j] + mb[i][j]; } int main(void) { int i, j; int ma[2][3] = { {10, -5, 4}, {18, -2, -18} }; int mb[2][3] = { {23, 16, -9}, {-3, 20, 5} }; int mc[2][3] = { 0 }; mat_add(ma, mb, mc); for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) printf("%3d", mc[i][j]); putchar('\n'); } return (0); }

  • 互いのクラスで互いのクラスのポインタを持ち合う方法

    ◆hoge.h #pragma once #include "fuga.h" class Choge{ protected:  Cfuga *fuga; public:  Choge( void ){ fuga=new hoge(this); }  ~Choge(); }; ◆fuga.h #pragma once #include "hoge.h" class Cfuga{ protected:  Choge *hoge; public:  Cfuga( hoge *h ){ hoge=h; }  ~Cfuga(); }; このように互いのポインタを持ち合うようなクラスを作りたいのですが、 下記のようなエラーが出てどうにもうまくいきません。 c:\...\hoge.h(5) : error C2143: 構文エラー : ';' が '*' の前にありません。 c:\...\hoge.h(5) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません c:\...\hoge.h(5) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 環境はVisualC++2005(ExpressEdition)、WindowsXPです。 どうすれば実現できるでしょうか?

  • for 3ループについて教えて

    for 3ループについて教えて * ** *** **** * ** *** **** * ** *** **** と表示させたいのですが、 #include<stdio.h> int main(void) { int i,j,k; for(i=1; i<=4; i++) { for(j=1; j<=i; j++){ // for(k=1; k<=3; k+=i){ } printf("*"); } printf("\n"); } return 0; } * ** *** **** このように表示されてしまいます。//の所が違うなと思います。が、分かりそうで分かりません。 もし、分かるかたがいましたら、教えてください。 よろしくおねがいします。

  • C言語の行列の積

    現在C言語を勉強中で2列2列の行列の積のコードを書きたいのですが、 いまいちうまくできません。 int main () {  int i,j;  int M1[2][2] = {{1,2},{3,4}};  int M2[2][2] = {{-1,5},{-2,-2}};  int A[2][2];  for (i=0;i<2;i++)  {   for (j=0;j<2;j++)   {    A[i][j]=0;    A[i][j]+=M1[i][j]*M2[i][j];    printf("%d\t",A[i][j]);   }  printf("\n");  } return 0; } 調べたりしてなんとか書いてはみたのですが理解が浅く、 コンパイルできても違う答えが返ってきます。 どこがどう間違っていますか? また、どのようにしたらうまいコードになりますか? 何卒、よろしくお願いします。

  • VC2005 ビルド時の警告内容

    C初心者です。 配列のアドレスを表示させようとしています。 以下、実処理の一部です。 short int a[4]; a[0] = 10; a[1] = 20; a[2] = 30; a[3] = 40; printf("&a[0]=%#x\n",&a[0]); これでビルドを行うと警告が出ます。 warning C4313: 'printf' : 書式文字列内の '%x' が引数 1 ('short [4]' 型) と競合しています。 VC++6.0の時は出なかったと思うのですが、VC++2005にしたらこのように表示されます。 どのように解消すればよいのでしょうか?

  • このコードは省いてもよいのでしょうか?

    下記のプログラムは2行3列の行列と3行2列の行列の積を求めるものです。 int main(void) { int i, j, k; int mx[2][3] = {{1, 2, 3}, {4, 5, 6}}; int my[3][2] = {{1, 5}, {5, 3}, {8, 1}}; int mz[2][2] = {0}; for(i=0; i<2; i++) { for(j=0; j<2; j++) { mz[i][j] = 0; for(k=0; k<3; k++) mz[i][j] += mx[i][k] * my[k][j]; } } for(i=0; i<2; i++) { for(j=0; j<2; j++) printf("%3d", mz[i][j]); putchar('\n'); } return (0); } 【質問】 main関数冒頭で int mz[2][2] = {0}; と初期化されていますが、後に出てくるforループ中の mz[i][j] = 0; は結局同じことをして無駄なコードではないのでしょうか? このコードを省いたプログラムをコンパイルして実行しても結果には影響ありませんでした。 とはいえ、考えが合っているか不安なので回答よろしくお願いします。

  • C言語 エラー表示 break の位置が誤っている(関数 main ) 

    #include<stdio.h> int main(void){ int n,i,j,k; char c='*'; printf("正の整数:"); scanf("%d",&n); if(n>0){ for(i=1;i<=n;i++){ printf("%d",i); for(j=1;j<=n+1-i;j++){ if(j==1){ if(i-1>0){ for(k=i-1;k>0;k--){ printf(" "); } } } printf("%c",c); } printf("\n"); } } break; return 0; } これをコンパイルすると「break の位置が誤っている(関数 main )」と表示されるのですが何でですか? 困ってます↓

  • 無限ループを抜け出す方法を教えて下さい。

    ご覧いただきありがとうございます。 タイトルの通り、無限ループを抜け出す方法を教えて頂きたいです。 for( ; ; i++) { printf( "%ld", i ); } たとえば、上記の無限ループをキー入力待ちをすること無しに、キー入力があった場合に途中で抜ける方法はあるのでしょうか? ご回答のほどよろしくお願いいたします!!

  • C++ の多次元配列なんですが

    int i,j; int (*p)[2][3]; int *x; int a[2][3] = {{1,2,3},{4,5,6}}; p = &a; x = &a[0][0]; for ( i = 0; i < 2; i++ ) { for ( j = 0; j < 3; j++) { printf (" %d", (*p)[i][j]); } } printf (" | "); for ( i = 0; i < 2; i++ ) { for ( j = 0; j < 3; j++) { printf (" %d", *(x + ( i * 3 + j )) ); } } printf (" | "); for ( i = 0; i < 6; i++ ) { printf (" %d", *(x + i) ); } これで大丈夫でしょか?