#include<stdio.h>
int main(void)
{
label:
int x;
scanf("%d",&x);
if(x==1)
goto label;
}
こういうプログラムを書いたのですが
scanfが最初の1回しか代入できません、
gotoでもとに戻るはずなのに何故できないのでしょうか?
C言語のgotoについて
Re: C言語のgotoについて
コードはBBcodeを有効にした状態でcodeタグで囲み、
かつ適切にインデントをしていただけると、見やすくてありがたいです。
最初の1回しか代入できていないことをどうやって確かめましたか?デバッガですか?
コンパイル結果のアセンブリを出力してみると、どんな処理がされているかわかります。
かつ適切にインデントをしていただけると、見やすくてありがたいです。
最初の1回しか代入できていないことをどうやって確かめましたか?デバッガですか?
コンパイル結果のアセンブリを出力してみると、どんな処理がされているかわかります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: C言語のgotoについて
試してみたところ、5行目で
「ラベルは文または宣言の一部にのみなることができます。文になることとは出来ません」
(注:「なることとは」は原文ママ)
というコンパイルエラーになりました。
ラベルとgotoを追加する前の、古いプログラムを実行しているのではないですか?
「ラベルは文または宣言の一部にのみなることができます。文になることとは出来ません」
(注:「なることとは」は原文ママ)
というコンパイルエラーになりました。
ラベルとgotoを追加する前の、古いプログラムを実行しているのではないですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: C言語のgotoについて
VC++でC++としてコンパイルした時はコンパイルが通ります。
なお、scanfはちゃんとループしてます。条件を勘違いしていなければですが・・・。
なお、scanfはちゃんとループしてます。条件を勘違いしていなければですが・・・。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: C言語のgotoについて
scanfへの入力として,どのような文字列を与えましたか。startcgengo さんが書きました:scanfが最初の1回しか代入できません、
gotoでもとに戻るはずなのに何故できないのでしょうか?
数字と空白以外のものを与えた場合,scanfはxへの代入に失敗し,バッファには元の文字列が残り続けます。
この結果,xが1になった後に失敗すると,xが1のままバッファから数字を取ろうとしては失敗し続けることになります。
e.g.) 入力:"1 x"の場合。
Re: C言語のgotoについて
こういう構造っていうのは
gotl label;という文と、
label:
という文の間に書いた全ての文はもう一回再定義されることになるんですか?
int x;
int x;
のように二回連続で定義したらエラーが出ますが、エラーが出ないという事は
理論的には再定義という事でOKですか?
gotl label;という文と、
label:
という文の間に書いた全ての文はもう一回再定義されることになるんですか?
int x;
int x;
のように二回連続で定義したらエラーが出ますが、エラーが出ないという事は
理論的には再定義という事でOKですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: C言語のgotoについて
再定義ではないですね。単なるループです。
変数宣言などのコンパイル時に確定されるものと、実行文の処理を混同していると思います。
変数宣言などのコンパイル時に確定されるものと、実行文の処理を混同していると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: C言語のgotoについて
>softyaさん
goto=ループなんですか、だからエラーでないんですね、ループの場合
中に変数宣言があってもエラーでませんもんね、ありがとうございます、解決しました。
goto=ループなんですか、だからエラーでないんですね、ループの場合
中に変数宣言があってもエラーでませんもんね、ありがとうございます、解決しました。
Re: C言語のgotoについて
ちょっと気になって↓のコードをVS2012で試したら出力は
Copy Constructor
Destructor
Copy Constructor
Destructor
Copy Constructor
Destructor
Copy Constructor
Destructor
Copy Constructor
だった.
5回のループでのT2は全て別の物なのだな.
Copy Constructor
Destructor
Copy Constructor
Destructor
Copy Constructor
Destructor
Copy Constructor
Destructor
Copy Constructor
だった.
5回のループでのT2は全て別の物なのだな.
class CTest
{
public:
CTest(){}
CTest( const CTest &rhs )
{
std::cout << "Copy Constructor" << std::endl;
}
CTest &operator=( const CTest &rhs )
{
std::cout << "operator=" << std::endl;
return *this;
}
~CTest(){ std::cout << "Destructor" << std::endl; }
};
int main( int argc, char **argv )
{
int iter_count = 0;
CTest T1;
label:
CTest T2 = T1; //ここで何と表示されるか?
if( iter_count++ < 5 )
{ goto label; }
return 0;
}