C言語の基本的なことで躓いてしまって
自分でいくら考えてみても、わかりません・・。
よければ教えて頂けないでしょうか。
-----
{
int count;
for (count = 0; count < 5; count++) {
printf("countは今%dです\n", count );
}
if (count == 4) {
printf("正解は4でした\n");
} else if (count == 5) {
printf("正解は5でした\n");
} else {
printf("正解は4でも5でもありませんでした\n");
}
}
----------
上のプログラムを実行すると”正解は5でした”と出るのは分かります。
しかし”countは今4です”までしか出ないのが何故だか分かりません。
ここは5ではないんでしょうか?
私は何か根本的なことが分かってないのでしょうか・・。
教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (7件)

こんにちは。


C言語のマニュアルで、forのところを読まれたら、わかると思いますが。
上記にかかれているプログラムのfor文の処理される順番は

(1)countに0をいれる
(2)count < 5 の条件文を満たしているかチェックする(今はcountは0)
(3)条件文を満たしているのでprint文を実行する(countは今0です を表示)
(4)countに1をたす(countは1となる)
(5)count < 5 の条件文を満たしているかチェックする(今はcountは1)
(6)条件文を満たしているのでprint文を実行する(countは今1です を表示)
(7)countに1をたす(countは2となる)
   ・
   ・
 繰り返し行う
   ・
   ・
・countに1をたす(countは4となる)
・count < 5 の条件文を満たしているかチェックする(今はcountは4)
・条件文を満たしているのでprint文を実行する(countは今4です を表示)
・countに1をたす(countは5となる)
・count < 5 の条件文を満たしているかチェックする(今はcountは5)
・条件文を満たしていないので、forループを抜ける。

次の処理を実行する。
   ・
   ・

なので、for文を抜けた時点でcountは5になっています。
なので、「正解は5でした」と表示されます。
しかし、for文内の処理が実行されるのは、count<5の間なので、
「countは今4です」までしかでないのです。

あと、forは関数ではありません。ループ文です。
まずは、基本を身に付けるようにがんばって勉強してくださいね。
    • good
    • 0
この回答へのお礼

ありがとうございます!すごくわかりやすかったです。

あの,条件文を満たしていたら、countに1を足し、print文を実行する。
という順番にならないのは何故ですか
(count = 0; count < 5; count++)と先にかいてあって、その後にprint文がきてるので
先にcountに1をたしてから、print文を実行するとどうしても思ってしまうんですが
なぜcount++はprint文の後に来ないのでしょうか・・

お礼日時:2001/02/27 03:53

> (count = 0; count &lt; 5; count++)と先にかいてあって、その後にprint文がきてるので


> 先にcountに1をたしてから、print文を実行するとどうしても思ってしまうんですが
> なぜcount++はprint文の後に来ないのでしょうか・・

まず while 文によるループが基本であると考えてください。
つまり、ある条件が成り立っている間、処理をし続けると
いうのが普通のパターンです。
もっと極端な話をすれば、while 文があれば、for 文は必要
ないのです。全ての for 文は、while 文で書き換えること
ができますから。
では、なぜ for 文があるかというと、やはりカウンタを使
ったループを使いたい場合が多いからではないでしょうか。
「ある回数だけループさせたい」という場合、毎回 while
文でカウンタ変数を使って書いていると、カウンタ変数を
カウントアップする個所を同じように毎回ループ内に書か
なければいけません。
それより for 文を使えば、カウンタ変数のカウントアップ
という、ループ内処理には関係ない命令をループ内に書かな
くても済みますよね。
for ループは while ループの特殊な形だと思えばよいと思
います。
    • good
    • 0
この回答へのお礼

ありがとうございます。なんだか難しいです。

お礼日時:2001/02/28 04:36

koreiです。

補足しますね。

for文は、
for(初期化;条件文;式){} 
と記述します。
実行の順番が、
(1)初期化(最初の";"で区切られたところまで)
(2)条件文(";~;"まで)
(3){}の中
(4)式(最後の";"以降)
(5)条件文(";~;"まで)
(6){}の中
(7)式(最後の";"以降)
・・・
と決まっています。

即ち、
for(最初だけ;実行(1);実行(3)){
   実行(2)

となり、実行(1)~実行(3)の順番で、条件文(実行(1))が満たされている間、
ループする訳です。

なので、上記のプログラムでは、count++を実行してから、print文の実行にはならない訳ですね。


初級向けのC言語のマニュアルのfor文のところを見てみましょう。
もっと、わかりやすく載っていると思いますよ。

では、勉強をがんばってください。
    • good
    • 0
この回答へのお礼

ありがとうございます。そういう順番だとして覚えてしまえばいいんですね。

お礼日時:2001/02/28 04:35

「関数for」と言う段階で“根本的なことが分かってない”が証明されています。


forは“関数”ではありません。
また、C言語に“命令”という概念はありません。
forは“制御文を示すキーワード”です。

forループを分解するとこういうカンジです。

for (i = 0 ; i < 5 ; i++) {
  printf("%d", i) ;
}
printf("終わり") ;
これは
1.iに0をいれる
2.iが5より小さければ3以降、違ったら6以降を実行
3.printf("%d", i)関数の実行
4.iをカウントアップする
5.2に戻る
6.printf("終わり")関数の実行

whileループに書きなおすと
i = 0 ;
while (i < 5) {
  printf("%d", i) ;
  i++ ;
}
printf("終わり") ;

iが5の時にループ内を通らない理由はわかると思います。
    • good
    • 0
この回答へのお礼

ありがとうございます

お礼日時:2001/02/27 03:55

KOH_daさんの回答ですが、


「2周目以降の判定の直前に行なわれます。」と書いてありますが、
1つの構文で、たとえばループの構文で1周目は処理しない、2周目以降は処理するという風に違う処理をする事は有りません。
ですから、
「for命令のcount++の処理は1周目、2周目、・・・の最後に処理されます。」
という風に理解する方がよろしいと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます

お礼日時:2001/02/27 03:54

for命令はループに入る前に判定を行ないます。


またcount++というのは、2周目以降の判定の直前に行なわれます。
だから、countが5になった時にはループ内を通らずに、
処理を抜けてうため「countは4です」とは表示されません。

判定を最後に行ないたい場合は、do~whileという命令を使うか、
無限ループを作り、if(条件)break;というのを、
ループの最後の方に入れることが多いです。
    • good
    • 0
この回答へのお礼

ありがとうございます

お礼日時:2001/02/27 03:54

 for 文を while 文に書き換えてみるとわかりやすいと思います。


 次の while 文は、ご質問の for 文と同じ動作をします。count++ が実行されるタイミングに注意してみてください。

count = 0;
while (count < 5) {
 printf("count は今 %d です\n", count);

 count++;
}

 例えば、今 count が 4 であるとします。
 printf で“count は今 4 です”と表示されます。
 count++ で count が 5 になります。
 しかし、次に while で (count < 5) の条件を満たさないので、printf や count++ は実行されずに while ループを抜けます。
 “count は今 5 です”と表示されないのはこのためです。
 ループを抜けたとき count は 5 になっていますから、“正解は 5 でした”と表示されます。

 count++ は (count < 5) の評価の直前に実行されると考えてください。
    • good
    • 0
この回答へのお礼

ありがとうございます

お礼日時:2001/02/27 03:54

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qフォームのラベルのプロパティを自動で設定したい

Access2013 vba です。

フォームの全てのラベル、テキストボックス、ボタン類をそれぞれの背景色や、テーマ、背景スタイルなどを設定したいのですが、どうやれば、全てのラベル、テキストボックス、ボタンなどを自動でループ処理で取得出来ますでしょうか。

よろしくお願いします。

Aベストアンサー

フォームをデザインビューで開く必要があります。で、保存。
windowmode は適当に。
標準モジュールで
docmd.OpenForm "formName",view:=acDesign,windowmode:=acHidden
forms!formName!ラベル2.backcolor = vbred
docmd.Close acForm ,"formName",save:=acSaveYes

Qtry{}catch(){}とデストラクタの関係を教えてください。

try-catchでメモリ確保を含むクラスをスローした場合、デストラクタはどの時点で働くのか、教えてください。たとえば、↓の使いかたは大丈夫でしょうか?

【1】
try{
 throw(CError(100, "エラー情報"));
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
}

【2】
try{
 CError err(100, "エラー情報");
 throw(err); // (1)
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
 //まだデストラクタはちゃんと動作するのでしょうか?
 //catchが呼び出し元のメンバであったりしても大丈夫なのでしょうか?
}

宜しくお願いします。

Aベストアンサー

【1】【2】どちらの場合も問題がありません。
コンパイラが必要に応じてerrオブジェクトのコピーを作成します。
デストラクタが呼び出されるタイミングはコンパイラに依存するところもあると思いますが、
例えばVC7.1では【2】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) CErrorクラスのテンポラリオブジェクト(以下a)のコピーコンストラクタが呼び出される。
(3) errオブジェクトのデストラクタが呼び出される
(4) catch文まで到達
(5) aオブジェクトのデストラクタが呼び出される。

VC7.1では、【1】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) catch文まで到達
(3) errオブジェクトのデストラクタが呼び出される。

コンパイラがオブジェクトのコピーを省略しているようです。

QVBA:ユーザフォームのラベルの指定の仕方教えてください。

 今、ユーザフォームに20個のラベルがあります。それぞれのラベルは、条件によりラベルの表示内容が変更します。そこで、ラベルの表示変更が必要なときにすぐに変更できるようにしたいと考えています。しかし、例えば以下のようなコードを作成するとエラーになり困っています。
 Label(i)で、iの番号によりラベルが呼び出されないだろうかと自分なりに作りましたがダメでした。以下のようなループ文中で特定のラベルを呼び出し処理することは不可能でしょうか?
 やはり、UserForm1.Label3などのように番号をきちんと書かないとダメでしょうか?本当は、ラベルが82個ありその一つ一つにコードを割り当てるのが大変です。また、きれいなコードで書きたいと思うからです。宜しければ、ご教授願います。
--------------------------------------------
Sub セルの値をラベル表示する()
For i = 1 To 20
With UserForm1.Label(i)
.Caption = Cells(1, i)
End With
Next i
End Sub

 今、ユーザフォームに20個のラベルがあります。それぞれのラベルは、条件によりラベルの表示内容が変更します。そこで、ラベルの表示変更が必要なときにすぐに変更できるようにしたいと考えています。しかし、例えば以下のようなコードを作成するとエラーになり困っています。
 Label(i)で、iの番号によりラベルが呼び出されないだろうかと自分なりに作りましたがダメでした。以下のようなループ文中で特定のラベルを呼び出し処理することは不可能でしょうか?
 やはり、UserForm1.Label3などのように番号...続きを読む

Aベストアンサー

 Excel VBAではコントロール配列はサポートされていませんが、ラベルの名前をLabel1, Label2,・・・ Label20とすると、以下のコードでほぼ同じことを実現できます。

Sub セルの値をラベル表示する()
 For i = 1 To 20
  With UserForm1.Controls("Label" & i)
   .Caption = Cells(1, i)
  End With
 Next i
End Sub

Q{x = x>y ? x:y; return x;}

#include <iostream>
using namespace std;

inline int max(int x, int y){x = x>y ? x:y; return x;}

int main()
{
int num1, num2, ans;

cout << "2つの整数を入力して。\n";
cin >> num1 >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
の{x = x>y ? x:y; return x;}の部分の意味が解りません。

Aベストアンサー

inline int max(int x, int y){x = x>y ? x:y; return x;}
これを普通に関数で書くと

int max(int x, int y)
{
x = x>y ? x:y;
return x;
}

です。

x = 部分は右辺の結果が代入されます。これはわかりますよね。
x>y?x:y;
と書くと?より左にある条件式を判定し、その結果が真である場合は:で区切られた左側の値を、偽である場合は右の値を帰します。
x>yが真であればxを、偽であればyを返します。
それが、左辺値xに代入され、関数の戻り値として帰ります。

従って、2つの値をこの関数に入れると、大きいほうの値が帰ることになります。

Qエクセルグラフの軸ラベルを一括変換出来なくて困っています。

お世話になります。
初めて投稿いたします。

VBA初心者です。エクセルグラフの軸ラベルを一括変換したいのですが、分からなくて困っています。

過去ログ、個人HPなどを参考にして、一つのグラフを選択、下記マクロを実行すれば、一つのグラフのみなら軸ラベルを変更する事が出来たのですが、ワークシート内の複数の埋め込みグラフを一発でラベル変更する場合のマクロが作成できません。

当方会社員、データをまとめる為、今回100ヶほどのグラフを一括変換したいため、どうしてもマクロ処理したいと考えています。
For Each・・・Next でループさせたいのですが、何分初心者勉強中の為、エラー多発、何方かお分かりの方、お助け下さい。


Sub 軸ラベル一括変換()
With ActiveChart
With .Axes(xlCategory, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "X"
End With
With .Axes(xlValue, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "y"
End With
End With
End Sub

お世話になります。
初めて投稿いたします。

VBA初心者です。エクセルグラフの軸ラベルを一括変換したいのですが、分からなくて困っています。

過去ログ、個人HPなどを参考にして、一つのグラフを選択、下記マクロを実行すれば、一つのグラフのみなら軸ラベルを変更する事が出来たのですが、ワークシート内の複数の埋め込みグラフを一発でラベル変更する場合のマクロが作成できません。

当方会社員、データをまとめる為、今回100ヶほどのグラフを一括変換したいため、どうしてもマクロ処理したいと考え...続きを読む

Aベストアンサー

こんなのではどうでしょうか?

ActiveSheetの全グラフを変更する場合
Sub 軸ラベル一括変換()
Dim co As ChartObject
For Each co In ActiveSheet.ChartObjects
With co.Chart
With .Axes(xlCategory, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "X"
End With
With .Axes(xlValue, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "y"
End With
End With
Next
End Sub

全シートの全グラフを変更する場合
Sub 軸ラベル一括変換()
Dim ws As Worksheet
Dim co As ChartObject
For Each ws In ThisWorkbook.Worksheets
For Each co In ws.ChartObjects
With co.Chart
With .Axes(xlCategory, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "X"
End With
With .Axes(xlValue, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "y"
End With
End With
Next
Next
End Sub

こんなのではどうでしょうか?

ActiveSheetの全グラフを変更する場合
Sub 軸ラベル一括変換()
Dim co As ChartObject
For Each co In ActiveSheet.ChartObjects
With co.Chart
With .Axes(xlCategory, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "X"
End With
With .Axes(xlValue, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "y"
End With
End With
Next
End Sub

全シートの全グラフを変更する場合
Sub 軸ラベル一括変換()
Dim ws As Worksheet
Dim co As ChartObject
For Eac...続きを読む

Qprintf("\a");のアラーム音

言語:c

#include <stdio.h>

int main ( void ) {
printf("\a");
return (0);
}

上記のプログラムを実行すると、
アラーム音(?)が鳴ります。

音が出ている場所がスピーカからではなくて、
PCの本体から出ているようです。

なぜスピーカから鳴らないのでしょうか。
なぜPC本体から鳴っているのでしょうか。

Aベストアンサー

環境にもよるのですが…Windowsですか?一般的なPCの場合、
スピーカからなる宇和揺る普通のサウンドの他に、BEEP音源というのがありまして。
こちらはデバイスが違うのでPC本体から直接音が鳴ります。
# 現在では、例えばシステムの異常を通知するような時くらいしか使われないかも。
で、\aにこちらが使われるのは、多分にMS-DOS時代からの歴史的な経緯じゃないかと思います。
昔はコレでも普通でしたし、
\aは「何か音がなればいい」というものであって、どんな音を鳴らすかは別に決まってないですし、
めったに使われないので綺麗なサウンドとか必要ないと思いますし、
OSがおかしくてもなる可能性がBEEPの方が高いかもしれませんし…。

Qループ中にlabel_clickの読み込みを認識する

開発環境はMicrofoft visual stdio 2005 で開発言語はC#を使い、Windousアプリケーションでプログラミングしているのですが
ループ中に、ラベルがクリックされたことを認識したいのです。ソースで説明すると
private void Form1_Load(object sender, EventArgs e)
{
  while(1)
  {
    if(label1がクリックされたら・・・)
    {
    }
    else if(label2がクリックされたら・・・)
    {
    }
  }
}
このようなif文を書きたいのですが、よい方法はないでしょうか?
よければ御知恵を貸してください。よろしくおねがいしますm(__)m

Aベストアンサー

あるプロシージャの中でループしているときに他のコントロールでのイベントを認識させるなら Application.DoEventsなどを呼び出してWindowsのメッセージポンプを機能させましょう

LabelのClickイベント自体は別途記述して そのフォームクラスのフィールドにクリックされたのかどうかを記憶しておきます

そのループ処理中でフィールドをチェックするようにすればいいと思います

boolean lbl1Click= false, lbl2Click = false;
などと宣言しておいて

void lblClick( s as object, e as Eventargs )
{
  Label lbl = (Label)s;
  if ( lbl.Name == "label1 )
  {
    lbl1Click = true;
  }
  esle if ( lbl.Name == "label2" )
  {
    lbl2Click = true;
  }
}
といった具合でクリックイベントを処理します

ループ処理側では
while( 1 )
{
  Application.DoEvents();
  if ( lbl1Click )
  {
    // Label1がクリックされた場合の処理
  }
  else if( lbl2Click )
  {
    // Label2がクリックされた場合の処理
  }
}
といった具合でしょう …

あるプロシージャの中でループしているときに他のコントロールでのイベントを認識させるなら Application.DoEventsなどを呼び出してWindowsのメッセージポンプを機能させましょう

LabelのClickイベント自体は別途記述して そのフォームクラスのフィールドにクリックされたのかどうかを記憶しておきます

そのループ処理中でフィールドをチェックするようにすればいいと思います

boolean lbl1Click= false, lbl2Click = false;
などと宣言しておいて

void lblClick( s as object, e as Eventargs )
{
...続きを読む

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。

Qワードの連番のラベル名が消える

ワード2003+XPです。
連番機能で、三種類のラベルA,B,Cに対して連番を作成しました。
保存後に開くといつの間にか、ラベルAが全てラベルBに変わり、元のAとBが区別なく連番がつきました。

フィールドコードを見ると元は
ラベルA・・・・・ SEQ ラベルA・・・・
ラベルB・・・・・ SEQ ラベルB・・・・
ラベルC・・・・・ SEQ ラベルC・・・・
だったものが、何故か、

ラベルA・・・・・ SEQ ラベルA・・・・
が全て
ラベルB・・・・・ SEQ ラベルB・・・・
に変わっています。
オフィスと自宅で文書作成をしておりどこで変わったのかわからないのです。
どなたか原因について心当たりあれば教えてください。
手動で、もとに戻しましたが、再発を防止したいので。

Aベストアンサー

図表番号がおかしい動作をするのですね。
もしかしたらWord2000を使っていませんか?

例えば、変更履歴を使っていませんか?
[WD2000] クロスリファレンス、図表番号の番号が異なる
http://support.microsoft.com/kb/252619/ja

それ以外の原因だとこちら↓とか。
http://support.microsoft.com/kb/252619/ja
http://support.microsoft.com/kb/211707/ja

どれもWord2000の不具合のようなのですが、私はWord2000を触る程度に
扱ったことがありますが、現時点での対処方法はサポートページにある
ものを紹介する以外にアドバイスはできません。他のバージョンの場合
ならWordのバージョンを補足されてはいかが。

Word2007を使っている場合だと、私はまったく門外漢ですので補足への
追加回答はほとんどできないと思います。
(他のバージョンでも専門家ではないので門外漢は不適切な使い方かも)

とりあえず変更履歴を使わないとか、[ SEQ ]フィールドを[図表番号]
からではなく直接フィールドコードから入力するとかの手動で対応する
とかで対応ことになるようですが。
(確実な対処方法ではないし、適切なアドバイスでもありませんが)

図表番号がおかしい動作をするのですね。
もしかしたらWord2000を使っていませんか?

例えば、変更履歴を使っていませんか?
[WD2000] クロスリファレンス、図表番号の番号が異なる
http://support.microsoft.com/kb/252619/ja

それ以外の原因だとこちら↓とか。
http://support.microsoft.com/kb/252619/ja
http://support.microsoft.com/kb/211707/ja

どれもWord2000の不具合のようなのですが、私はWord2000を触る程度に
扱ったことがありますが、現時点での対処方法はサポートページにある
もの...続きを読む

Qchar AA[]{"全角文字"};から"全"という一字を取り出したい

 今晩は、Cの初心者です、宜しくお願いします。
 全角文字の入ったchar AA[]{"全角文字"};から"全"という文字一字を取り出す時にAA[0]とかくとエラーになります。
 どのようにしたら取り出せるのでしょう。
 ポインタを使う方法と使わない方法を教えて下さい。
 宜しくお願いします。

Aベストアンサー

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出す必要があります。

>char AA[]={'全','角'};

char AA[]="全角";
とし
>printf("%s%s\n" , AA[0],AA[1] ) ;

printf("%c%c\n" , AA[0],AA[1] ) ;
とすれば、「全」だけを表示する事が可能と思われます。

日本語を文字列で表示する為の文字コードについては
Shift-JISだけでなく、UnicodeやUTF・EUC・JISなどがあります。

もう少し詳しく記載してあるホームページはないか探してみましたが、ちょっと無理でした。

参考URL:http://marupeke296.com/CPP_charUnicodeWideChar.html

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出...続きを読む


人気Q&Aランキング

おすすめ情報