C言語のgotoについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
startcgengo

C言語のgotoについて

#1

投稿記事 by startcgengo » 11年前

#include<stdio.h>
int main(void)
{
label:
int x;
scanf("%d",&x);


if(x==1)
goto label;

}

こういうプログラムを書いたのですが
scanfが最初の1回しか代入できません、
gotoでもとに戻るはずなのに何故できないのでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C言語のgotoについて

#2

投稿記事 by みけCAT » 11年前

コードはBBcodeを有効にした状態でcodeタグで囲み、
かつ適切にインデントをしていただけると、見やすくてありがたいです。

最初の1回しか代入できていないことをどうやって確かめましたか?デバッガですか?
コンパイル結果のアセンブリを出力してみると、どんな処理がされているかわかります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C言語のgotoについて

#3

投稿記事 by みけCAT » 11年前

試してみたところ、5行目で
「ラベルは文または宣言の一部にのみなることができます。文になることとは出来ません」
(注:「なることとは」は原文ママ)
というコンパイルエラーになりました。
ラベルとgotoを追加する前の、古いプログラムを実行しているのではないですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: C言語のgotoについて

#4

投稿記事 by softya(ソフト屋) » 11年前

VC++でC++としてコンパイルした時はコンパイルが通ります。
なお、scanfはちゃんとループしてます。条件を勘違いしていなければですが・・・。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: C言語のgotoについて

#5

投稿記事 by YuO » 11年前

startcgengo さんが書きました:scanfが最初の1回しか代入できません、
gotoでもとに戻るはずなのに何故できないのでしょうか?
scanfへの入力として,どのような文字列を与えましたか。
数字と空白以外のものを与えた場合,scanfはxへの代入に失敗し,バッファには元の文字列が残り続けます。
この結果,xが1になった後に失敗すると,xが1のままバッファから数字を取ろうとしては失敗し続けることになります。
e.g.) 入力:"1 x"の場合。

startcgengo

Re: C言語のgotoについて

#6

投稿記事 by startcgengo » 11年前

こういう構造っていうのは
gotl label;という文と、
label:
という文の間に書いた全ての文はもう一回再定義されることになるんですか?
int x;
int x;
のように二回連続で定義したらエラーが出ますが、エラーが出ないという事は
理論的には再定義という事でOKですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: C言語のgotoについて

#7

投稿記事 by softya(ソフト屋) » 11年前

再定義ではないですね。単なるループです。
変数宣言などのコンパイル時に確定されるものと、実行文の処理を混同していると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

cgengostart

Re: C言語のgotoについて

#8

投稿記事 by cgengostart » 11年前

>softyaさん
goto=ループなんですか、だからエラーでないんですね、ループの場合
中に変数宣言があってもエラーでませんもんね、ありがとうございます、解決しました。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: C言語のgotoについて

#9

投稿記事 by usao » 11年前

ちょっと気になって↓のコードをVS2012で試したら出力は

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;
}

閉鎖

“C言語何でも質問掲示板” へ戻る