• ベストアンサー

C++のfor文について

C++では for ( int i = 0, j = 0; i < 10; i++ ) { } みたいな感じでforのなかで変数の宣言ができます。 ところで上の例ですとint型のiとjを2つ宣言していますが、 もしint型とchar型を宣言したい場合などは char j; for ( int i = 0; i < 10; i++ ) { } みたいにしないといけないのでしょうか? for ( int i = 0, char j; i < 10; i++ ) { } みたいにできると思ってやったらエラーになってしまうので・・。

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

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

★『for』文について ・『for』文は次のようになります。  『for ( 初期化式 ; 条件式 ; 増減式 ){ … }』です。  この3つの『式』は独立していますので省略などが出来ます。→3つ省略の可能(無限ループになる) ・最初の『初期化式』ですが、ここには1つの『式』しか書けません。→昔から。 ・それで『C++』では『for』文の中にも変数の宣言子が記述できるように機能UP  しました。が、記述できるのは、やっぱり1つの式だけです。この1つの式に  『宣言子』が1つ付けれるだけなので複数の『宣言子』をカンマなどでは記述  出来ません。→回答者 No.2 さんの『言語仕様』って事ですね。 ・よって、回答者 No.1 さんの『回答へのお礼』みたいに『char j』は外で宣言  するしかないでしょう。 余談: ・無限ループを構成するのに『while ( 1 ){ … }』が有名ですが、『for』文でも  構成できます。→このとき、3つの式を省略します。 ・つまり『for ( ; ; ){ … }』とします。  このやり方の方が、警告メッセージなどが出ないため『すっきり』します。 ・以上。おわり。

その他の回答 (3)

  • yukimican
  • ベストアンサー率70% (112/159)
回答No.4

スコープが気になるなら、 {  int i;  char j;  for( ... )  {    ...  } } という感じで、変数宣言も含めて中カッコで囲んでしまえばよいかと。

回答No.2

型の違う変数をカンマで区切って宣言することは、できません。 残念ながら、言語仕様でそうなっています。 なので、 char j; for(int i=… もしくは、 char j; int i; for(i=… などとするほうが良いと思います(下のほうだとiのスコープが変わりますが)。 型が違うということは、iとは別の意味や動作に使うということでしょうから、カウンタとは別に宣言するほうが見た目にも良い気がします。

noname#39970
noname#39970
回答No.1

普通に宣言するにも int i,char j; ってできないよね? そういう事では?

amazontester
質問者

お礼

回答ありがとうございます。ということは char j; for ( int i = 0; i < 10; i++ ) { } みたいにするしか方法はないということでしょうか・・。

関連するQ&A

  • 【C言語】二重forループ内でscanfを使ってchar型変数に数値(

    【C言語】二重forループ内でscanfを使ってchar型変数に数値(%d)を入力すると、きちんとループ処理されないのはなぜ? プログラムを下に用意しましたのでご覧下さい。 二重forループ内で入力を繰り返すプログラムです。 ついでに i j の値を出力するようにしました。 -----------------プログラム---------------- int main (void){ char input = 0; // 入力値 char型にするとforループでインクリメントエラー(int型にすると問題ない) int i = 0, j = 0; , printf("数値を入力して下さい。('-1' で入力終了)\n"); for( i=0 ; i<3 ; i++ ){ // i がちゃんとインクリメントされない for( j=0 ; j<3 ; j++ ){ scanf("%d", &input); // char 型変数に %d で入力すると、i がきちんとインクリメントされない printf("[i][j] = [%d][%d]\n", i, j); if( input == -1 ){ printf("入力を終了します。\n"); break; } } if( input == -1 ) break; } return 0; } ---------------------------------------- ---------実行結果(入力値はchar型)--------- 数値を入力して下さい。('-1' で入力終了) 1 2 3 4 5 6 7 8 9 [i][j] = [0][0] [i][j] = [0][1] [i][j] = [0][2] [i][j] = [0][0] [i][j] = [0][1] [i][j] = [0][2] [i][j] = [0][0] [i][j] = [0][1] [i][j] = [0][2] -1 [i][j] = [16777215][0] 入力を終了します。 ---------------------------------------- ----------実行結果(入力値はint型)---------- 数値を入力して下さい。('-1' で入力終了) 1 2 3 4 5 6 7 8 9 [i][j] = [0][0] [i][j] = [0][1] [i][j] = [0][2] [i][j] = [1][0] [i][j] = [1][1] [i][j] = [1][2] [i][j] = [2][0] [i][j] = [2][1] [i][j] = [2][2] ---------------------------------------- ご覧の通り、char型変数に値を入力しているために、forループで i がきちんとインクリメントされません。 入力値は -128~127 の値しか想定していないので、メモリの消費を少しでも抑えようと思いchar型で宣言したのですが、思わぬ所でおかしな挙動が起こってしまいました。 int型で宣言すればいいだけなのですが、なぜこんな挙動になるのか知りたいです。 よろしくお願いします。

  • for文での変数宣言について(他言語共通)

    for(var i = 0; i < 9; i++) { } このように、for文の()内で変数宣言をすることがあるだろうと思います。 これを入れ子にするのならば当然(場合にもよりますが) for(var i = 0; i < 9; i++) { for(var j = 0; j < 9; j++) { } } このように、新しい変数を定義します。 しかし、次のように、2つのfor文が並列する場合、2つ目のfor文で変数宣言をすべきではありません。 ですが、 片方だけに宣言がある・for文の外に宣言がある・2つ目のfor文には別の変数を宣言する いずれもしっくり来ません。 どのように書くのが一般的なのでしょうか。 皆様の書き方をご投稿ください。よろしくお願いします。 //ここでvar i = 0;と書くか … A for(i = 0; i < 9; i++)//ここでfor(var i = 0; i < 9; i++)と書くか … B { } for(i = 0; i < 9; i++)//ここでfor(j = 0; j < 9; j++)と別の変数を定義するか … C { } //または、いずれでもない回答者様のオリジナルの書き方 ※この例では、1つ目のfor文が終わった時点でiの値を保持する必要はありません。

  • C言語のfor文について

    C言語のfor文について C言語初心者です。質問させていただきます。 output.datというバイナリファイルに値を書き込みたい(100~149)のですが、どうもうまくいきません。 値が半分だけ正常に入って、あとの半分はおかしな値が入ります。 どなたか分かる方教えていただけないでしょうか。 ソース(一部分)↓ int main(){ int i,j; char output[456]; //ファイルに値を入れる for(i=0,j=100;i<456,j<556;i++,j++){ output[i]=j; } //バイナリ書き込みモードでファイルをオープン if((fp = fopen("output.dat","wb")) == NULL) { printf("<output.dat> file open error\n"); exit(1); } //値をファイルに書き込む fwrite(output,456,1,fp); fclose(fp); exit(0); }

  • C/C++ for文

    ふと疑問に思ったことなんですが、検索して調べても簡単に出てこなかったので 質問させていただきます。 C / C++ の文法に for 文がありますが基本的な for 文の書き方と言えば以下のようになりますよね。 for (int i = 0; i < 10; i++); この中の式に注目してほしいのですが、i = 0, i < 10; i++ のようにいずれも 1 つの文を書くことはできますよね。2 つの文を書きたい場合でも i++,i++ のようにカンマを使えば、2 つどころか 3 つ以上の文を書くことができます。 ここで、その式の部分に for 文を入れてみたらエラーが返ってきました。普通はこの部分に for 文を入れるなんてことはしないのでよくわからないのですが、なぜエラーが返ってくるのでしょうか。printfのような出力文でもいけるのに、for 文などではダメな理由がよくわかりません。

  • C++ for文

    C++を始めたばかりの初心者です。 課題がうまくいかないのでアドバイスください。 32から126までの95個の整数を一元配列に格納する。これらの整数値を文字型にキャストして、 10列の表形式で出力するプログラムを作成せよ。 ↓自分でやってみるとこうなりました。 #include <iostream> #include <cstdlib> #include <cmath> using namespace std; int main() { int i; int code[95]; char ch; for(i=0;i<=94;++i) code[i]=i+32; for(i=0;i<=94;++i) if((i+1)%10==0) ch='\n'; else{ ch=' ';  //半角スペースです。 cout<<(char)code[i]<<ch; } return EXIT_SUCCESS; } うまくコンパイルできれば   ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 ……と続いていくはずなんですが 自分の場合はコンパイルしても改行されず、10文字目が消えてしまいます。 (例えば「)」とか「3」が表示されません。) ch='\n';の行がおかしいという警告も出ています。 アドバイスお願いします。

  • for文初期化で整数と実数を混在させると値が狂う

    C++ではfor文の初期化時にカウンタ変数等の宣言ができますよね. 0°から360°を表示するプログラムの例なのですが,次のコードを見てください. int main(void) { const double drad = 2 * M_PI / 6; double rad; rad = 0.0; for (int i = 0; i <= 6; i++, rad+= drad) { // cout << "rad: " << rad << endl; cout << "deg: " << rad * 180.0 / M_PI << endl; } } このプログラムを実行すると,0°から60°ごとに360°まで表示されました. ここで,for文の初期化処理でradの初期化を行おうとして, for (int i = 0, rad = 0.0; i <= 6; i++, rad+= drad) とプログラムを書き換えたところ,表示値は deg: 57.2958 deg: 114.592 deg: 171.887 deg: 229.183 deg: 286.479 deg: 343.775 となりました. また,コメントアウトしてある行を有効にしてradの中身を直接表示させると, rad: 0 rad: 1 rad: 2 rad: 3 rad: 4 rad: 5 rad: 6 といったように,radが整数値に丸められています. int iをfor文の外で宣言して for (i = 0, rad = 0.0; i <= 6; i++, rad+= drad) としたときには,正しい角度の表示が行われました. これは,for文の初期化時に変数宣言を行うとき,同時にほかの初期化処理を記述してしまったらその変数も同じ型の新しい変数として宣言されてしまうということなのでしょうか? for (int i = 0, rad = 0.0;... →int i と int rad がスコープ内の変数として新しく宣言される?

  • C++ for文からwhile文への変換方法

    まずは単刀直入にこのプログラムをご覧ください。 int two[6][10]; for(int j=0; j<net; j++){ for(int i=0; i<10; i++){ input_file >> two[j][i]; if(two[j][i]==0) break; } } for(int j=0; j<net; j++){ for(int i=0; i<10; i++){ cout << two[j][i] << " "; if(two[j][i]==0) break; } cout << endl; } このfor文をwhile文に置き換えて表示させるやりかたがよくわかりません。 今ゼミの課題でC++のプログラムに取り組んでおり、ファイル内の数字の配列を読み込んでそれを画面に表示させるプログラムを作ってるのですが、この部分がよくわからず苦戦しています。 ちなみに表示させる数字は以下の通りです。 9 11 8 0 1 10 6 0 8 2 4 10 0 5 8 7 2 0 1 3 10 4 0 2 4 12 0 どなたかご教授よろしくお願いします<(_ _)>

  • for 文における処理の改善(C言語プログラム)

    はじめまして。panicdjです。 いまCでプログラムを組んでいます。 環境はVC++ver6.0 Win32 Console Applicationです。 以下のプログラムを見てください。 #define X_MAX 10 #define Y_MAX 20 #define Z_MAX 5 int main(int argc , char ** argv) { int i, j, k; int aa[10][20][5]; for (i = 0; i < X_MAX; i ++) { for (j = 0; j < Y_MAX; j ++) { for (k = 0; k < Z_MAX; k ++) { aa[i][j][k] = 10.0; } } return 0; } 過去のスレッドでポインタ型によるアクセスを すれば、処理が高速になるとかかれていました。 自分は,for文による繰り返す処理ではなく, その「ポインタ型によるアクセス」を実装したいのです。 こんな私にアドバイスお願い致します。

  • for文

    質問お願い致します。 これのソースのfor文を一つの文にするにはどのように書いたらよいでしょうか? お願い致します。 //指定された文字列が"a"と"b"の両方を含む場合はtrue、なければfalseを返す public class Mondai { public static void main(String[] args) { System.out.println("解答 :" + charBothContain("Habllow")); } public static boolean charBothContain(String str) { boolean answer1 = false; boolean answer2 = false; for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c == 'a') { answer1 = true; break; } } for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c == 'b') { answer2 = true; break; } } return answer1 && answer2; } }

    • ベストアンサー
    • Java
  • for文に使用する変数

    よく for(i=0;i<10;i++){ ”なんらかの処理” } みたいなソースがありますがここで使用する変数iはint型がよいと何かでみました。 数値が1byteで足りる分にはcharのほうがメモリ節約ができると思うのですが、どういった理由があるのでしょうか? どなたか知っている方はお教えください。

専門家に質問してみよう