• ベストアンサー

for文に使用する変数

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

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

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

まず、iがレジスタに割り付けられる場合について考えます。1バイトの汎用レジスタがない場合は、たとえchar型で宣言しても、レジスタのサイズになってしまいます。 次に、メモリに割り付けられる場合ですが、静的記憶域ならともかく、自動記憶域の場合は、スタック操作を容易にするために、レジスタと同じサイズに境界調整される場合が多いようです。複数のchar型変数を使うのでない限り、いくらchar型で宣言しても、int型に満たない部分は未使用領域になってしまう場合が多いと思います。 レジスタであれ、メモリであれ、int型未満の変数は、何らかの演算のたびに汎整数拡張と上位ビットの切捨て処理が発生します。通常プログラムもメモリを必要とするので、処理が煩雑になった分、変数の容量以上にメモリが必要になります。 組み込み用では、効率化のために汎整数拡張を行わない非標準処理系も存在します。その様な場合、その処理系ごとにどんな選択が一番よいかは調べる必要があります。

KXWonderful
質問者

お礼

ありがとうございました。勉強になりました。

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

その他の回答 (2)

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.2

がると申します。 んっと。int型は、特にそれがC言語(含むC++)である場合、「そのCPUがもっとも自然に解釈できるサイズ」とあります(そのためにあちこちでサイズが違って困るのですが)。 したがって、計算をするのに一番楽な型であるということになります。 ちなみに、charで計算を行うときは一度intにおきなおしてから…になるためにかえってコストがかかってしまいます。

KXWonderful
質問者

お礼

ありがとうございました。一度intにおきかえることになるということなんですね。

全文を見る
すると、全ての回答が全文表示されます。
  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.1

intは、原則としてその環境でもっとも標準的に扱える型となっています。16bitマシンでは16 bit, 64bitマシンでは64bitです。 メモリの最適化よりも、速度の最適化を目指しているわけですね。 もっとも、8bitマシンでは、intは16bitで実装されている場合もあり、例外はあります。 また、組み込み用など、メモリの最適化が重視されるときは、その限りではありません。

KXWonderful
質問者

お礼

ありがとうございました。

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

関連するQ&A

  • 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++ ) { } みたいにできると思ってやったらエラーになってしまうので・・。

  • 【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型で宣言すればいいだけなのですが、なぜこんな挙動になるのか知りたいです。 よろしくお願いします。

  • intやshortやcharの変数確保時間

    for文などでよく一時変数に for ( int i=0; ・・・ とか for ( short s=0; ・・・ とか for ( char i=0; ・・・ みたいに整数型の変数が使われます。 確か変数の表せる範囲は long>int>short>char だったと思うのですが、変数を確保する時間やメモリサイズに違いはあるのでしょうか? たとえばlong型変数を10万個確保する時間とintとかshortとかcharのそれ とは違いがあるのかなぁと疑問に思いました。

  • for構文内の変数について質問

    以下のソースコードの一部を見た上で私の質問に答えてください public class A { public static void main(String arg[]){ for(int i=0; i<2; i++){ for(int k=0; k<3; k++){ System.out.println(i+"-"+k); } } } } このソースコードを実行すると、以下のような数字がeclipsのコンソール画面に表示されます。 0-0 0-1 0-2 1-0 1-1 1-2 質問:変数kの値は、1、2と増えているに関わらず、再び0に戻ってますよね? 何故変数の中身の数値がクリアーされてるのですか? 質問2:for構文を一度脱出すると、変数の中身はクリアーされるのですか?それとも『ローカル変数の中身だけクリアー』されるのですか?

    • ベストアンサー
    • Java
  • for文使用時の変数の展開について

    初めて投稿します。 bat処理に関してfor文の制約?で困っています。 for文を2重に使用し(入れ子)、2つ目のfor文のオプションに変数を使用したいと思っています。 通常の変数(%data%)の場合は実行が可能なのですが、遅延環境変数(!data!)をトークンに使用すると、エラーとなって処理がうまくいきません。 ソースは以下のとおりです。 for /l %%e in (4,2,50) do ( set startToken=%%e set /a endToken=%%e+1 for /f "tokens=!startToken!,!endToken! delims=:" %%T in ("%fileLine%") do ( echo echo T %%T echo echo U %%U ) ) for文の制約なのでしょうか?

  • for文

    以下のプログラムのforの条件文がなぜこれで動くのかよくわからないので 教えていただけないでしょうか? #include<stdio.h> int main(void) { int i; char str[] = "ABC"; char *ptr = "123"; for(i=0;str[i];i++) putchar(str[i]); putchar('\n'); for(i=0;ptr[i];i++) putchar(ptr[i]); putchar('\n'); printf("str = \"%s\"\n",str); printf("ptr = \"%s\"\n",ptr); return(0); }

  • 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
  • 外部変数について

    今Vine Linuxを使ってC++でプログラムを書いているのですが教えて頂きたいことがあります. C++の初心者の為,変なことをお聞きしますがお許しください. extern宣言で他のソースのローカル変数を参照する方法はないのでしょうか? 例えば,a.cとb.cというソースがあったとします. a.cの関数内でint i;と宣言されている変数をb.cからextern int i;という風にしたいのですが, こうするにはa.cでグローバル変数としてint i;を定義する以外方法はないのでしょうか? できればグローバル変数を使いたくないのですがこれ以外では無理でしょうか? あともう一つお聞かせ下さい. メイン関数の引数を別の関数,またはソースで使うということはできないのでしょうか? int main( int argc, char *argv[] )のargv[1]というのを別の関数で使用したいのですがこれも無理でしょうか? 馬鹿な質問だとは思いますが,どなたかお答え頂けますでしょうか? よろしくお願いします.

  • for文について

    以下のプログラムにおいて, for文の末尾にセミコロンがついているタイプ( for(...); ) のfor文の制御の流れは,セミコロンがついていないタイプ( for(...) ) と何が違うのでしょうか? for文の末尾にセミコロンがないタイプのものしか知らないため, セミコロンがつくことで流れに何が変化するか知りたいです. 御存知の方がいらしたら,教えてください. 【出力結果】 forの末尾にセミコロンがある 2100 forの末尾にセミコロンがない 700 /*+++++++ ソース ++++++++*/ #include <stdio.h> int main() {  int s_tb1[3] = {60,100,150};  int mg_tb[3] = {1,3,4};  int i,size=80,base=600,mode=1,ext=100;  for(i=0; size>s_tb1[i]; i++);   printf("%d\n", (base+mode*ext)*mg_tb[i] );  return(0); }

  • 教えて下さい。for文内での変数宣言について

    Javaのプログラムで困っています。 for文内でfor分だけ変数を宣言したいのですが、 その際変数名に数字(ナンバリング)を付与した形にしたいと考えています。 例) String Test1 String Test2 : : 上記の様な場合、for文をどの様に作成したらいいですか? num = 5; for(int i = 0; i < num; i++){ String Test = null; } ⇒このままだと変数Testが1つしか出来ない・・・   変数の後にナンバリングしたいのですが上手くいきません。 numの数はユーザの指定で毎回変更されるため、 for文でその数だけ変数を作成したいと考えています。 どなたかご教授宜しくお願い致します。

    • ベストアンサー
    • Java