🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

4838閲覧

while(cin>>n){}のループから脱出できる理由を知りたいです。

sumachu

総合スコア22

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/01/01 16:22

編集2020/01/02 15:48

https://onlinejudge.u-aizu.ac.jp/problems/ALDS1_3_A
上記のURLの問題で、以下のコードを提出し、AC(Accepted)されました。

C++

1#include <bits/stdc++.h> 2 3using namespace std; 4 5int main() 6{ 7 string s; 8 stack<int> st; 9 while (cin >> s) 10 { 11 if (s == "+") 12 { 13 int a = st.top(); 14 st.pop(); 15 int b = st.top(); 16 st.pop(); 17 st.push(b + a); 18 } 19 else if (s == "-") 20 { 21 int a = st.top(); 22 st.pop(); 23 int b = st.top(); 24 st.pop(); 25 st.push(b - a); 26 } 27 else if (s == "*") 28 { 29 int a = st.top(); 30 st.pop(); 31 int b = st.top(); 32 st.pop(); 33 st.push(b * a); 34 } 35 else 36 { 37 st.push(stoi(s)); 38 } 39 } 40 cout << st.top() << endl; 41}

上記URLではACされるのですが、Visual Studio 2019で上記のプログラム実行してみると、結果出力まで至りません。
この相違が生じる理由として考えられる要因として何が挙げられるのでしょうか?
Visual Studio Community 2019でプログラムを実行する際、入力例を入力後、次の行でCtrl+Zを入力していましたが、その後、Enterキーを押していませんでした。

ちなみに、私は標準入力のループから脱出するには
式cin>>sの値が0であること、つまり、
抽出子>>の第2引数が見つからない場合、抽出子>>の返却値型であるbasic_istream&型として、0を返すように定義されている
と考えています。この解釈は正しいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bull

2020/01/02 01:34

当方の環境 (Windows10, Visual Studio 2019) では 1 2 + 5 4 + * と入力し、次の行で Ctrl+Z を入力することにより 27 という結果が出力されました。 プログラムを実行して、どのような操作をしましたか?
sumachu

2020/01/02 15:49

検証ありがとうございます。Visual Studio Community 2019でプログラムを実行する際、入力例を入力後、次の行でCtrl+Zを入力していましたが、その後、Enterキーを押していませんでした。すみません。Enterキーの押し忘れが原因でした。お騒がせしました。
guest

回答1

0

ベストアンサー

std::basic_istream (の基底である std::basic_ios) には operator bool が定義されています。 すなわち、 bool にキャスト可能で、そのようにキャストした場合にはメンバ関数 fail の返却値を逆にした値を返します。

なんらかの理由 (eof に到達した場合を含む) で入力処理がされなかった場合にはストリームに失敗フラグが設定されますので、メンバ関数 fail を呼び出した場合、 bool にキャストした場合にはそれに基づいた値が返されます。 つまり、繰り返し式の条件式にストリームを置いた場合には eof に到達するまで繰り返すという意味に使えます。

ただし、 eof に到達する以外の理由でも失敗フラグが設定されることは有りますので、エラーの対処をしっかりやりたい場合には個別のチェックが必要でしょう。 また、プログラムを読む人にとっても (まさに質問者がそうであるように) 暗黙の型変換を活用されるとどういう意味があるのかわかり難いのでメンバ関数 fail を陽に呼ぶ方がより親切な書き方ではあるかもしれません。

投稿2020/01/01 17:22

編集2020/01/02 05:56
SaitoAtsushi

総合スコア5684

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sumachu

2020/01/02 15:56

ご回答ありがとうございます。なるほど。変換関数operator boolが定義されているのですね。まさに私の知りたい内容でした。私も自力でご回答者様のご回答にたどり着けるように精進したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問