2017-07-30 14 views
-2

私は理解していないコードを見つけました。それはコーディングのウェブサイト上にあった。答えは私の知識でファイル操作を使用してチェックしているので、それがコードのウェブサイト上にあったので、コードはthis-forループがどのように終了しているかを説明してください。

#include<iostream> 
using namespace std; 

char s[4]; 
int x; 
int main() 
{ 
for(cin>>s;cin>>s;x+=44-s[1]); 
cout<<x; 
} 

のように私の質問はどのようにループのためには、を終了しているされました。しかし、IDE上で実行している場合、forループは終了せず、代わりにユーザーからの入力を受け取ります。これについての説明は何ですか?

サンプル入力

X ++

x--

-X-

出力

-1

EDIT

これは問題のリンクである - これはソリューションのリンクであるBit++

からistreamoperator bool()を有するためIn status filter set language to MS C++ Author name - wafizaini (Solution id - 27116030)

+1

それがどんなコーディングウェブサイトであっても、それから逃げる。変数は関数の外で宣言され、 'x'はユニット化されます。 – Fabien

+2

@Fabien "と" x "はユニット化されています。それは? – George

+0

@Fabien - 'x'はグローバルスコープで定義されているため、0に暗黙的に初期化されます。 –

答えて

1

ループが(終端される前にC++ 11にそれがoperator void*ました)追加の入力がない場合はfalseを返します。基本的には、ループが停止した理由は、より一般的なwhileループが終了する理由と同じである:

while (cin >> s) { 
    ... 
} 
あなたはIDEで実行したときに、これが終了しない理由は、あなたがストリームの終わりを供給する必要があるということです

マークは、システムに依存した方法で提供されます。 Windows上であなたははCtrl +Zを押しながら、UNIXおよびそれに由来する他のシステムでは、あなたは、DはCtrl +を押してください。

注:あなたのプログラムは、エンドユーザーが3文字以上を(文字#4は、文字列のNULL終端のために使用される)に入る場合にはバッファオーバーランを得ることの危険にさらされています。ループの本体に入る前にループ条件がチェックされているため、最初の入力cin>>sが破棄されることにも注意してください。

+0

1つの質問私はWindows 8.1プラットフォームでDev C++ 5.11を使用しています。あなたがCtrl + Zキーを押すと^ Zが表示され、^ Zを入力すると、それは異なって働いています。その理由は何ですか? – Ash

+0

@Ash Dev C++コンソールが正しく処理するかどうかはわかりません。コマンドラインでコンパイラによって生成されたexeを実行し、入力ストリームを終了したいときはCtrl + Zを押します。 – dasblinkenlight

0

より一般的なループ条件はwhile (cin >> s)です。

operator>>は、ストリーム(cin)への参照を返します。ストリームクラスには、入力が失敗した後にif (cin)またはwhile (cin)falseを返す変換演算子があります。

これはfor -loopの中間部分でも動作しますが、これは珍しいことです。

1

これは完全に有効ですが、読みにくいですが、C++ 11のコードです。

std::istream::operator>>() 

は、入力ストリーム自体への参照を返し、ひいては

std::istream::operator bool() 

はフェイルビットが設定されるたびにfalseを返すブール値にストリームを評価します。

ファイルから読み込むと、そのループは最終的にファイルの最後を読み取るようになり、eof failビットが設定され、ループが停止します。

しかし、シェルでそのコードを実行する場合は、ストリームにEOF制御コードを手動で入力する必要があります。そうしないと、forループは停止しません。これは、たとえばUnixシェルでCtrl + Dキーを押すことで実行できます。

関連する問題