質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

Q&A

解決済

1回答

855閲覧

c++でデータ型の上限を超えて入力した後、おかしな挙動をしてしまうのはなぜですか?

fk_beginner

総合スコア16

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

0グッド

0クリップ

投稿2021/11/19 12:25

編集2021/11/19 12:29

先ほどint型を利用して上限を超える大きな数字の入力を受けてしまいました。
そのときそれ以降の変数にも影響を及んでいたのですが、なぜこのようなことが起こったのでしょうか。
また症状を検索したところバッファオーバーフローという単語が出てきたのですがこれは関係があるのでしょうか?
実際には下に張ったコードにinputの内容を入力した際に、なぜかoutputの内容が出力されました。

c++

1#include <iostream> 2using namespace std; 3int main(void){ 4 5 int K;//int型に5000000000を入力しようとしてしまった 6 cin >> K; 7 8 for(int i=0;i<10;i++){ 9 10 int64_t a; 11 12 cin >> a; 13 14 cout << a << endl;//なぜかこの部分の数字もずれている 15 } 16} 17

input

15000000000 21 32 43 54 65 76 87 98 109 1110 12

output

14199056 24199056 34199056 44199056 54199056 64199056 74199056 84199056 94199056 104199056

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

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

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

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

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

guest

回答1

0

ベストアンサー

そのときそれ以降の変数にも影響を及んでいた

及んでいたわけではありません。cin >> K の読み込み結果がエラーになったので、以降の読み込みは全てスキップされています。
つまり、a は読み込み結果がそもそも反映されてなくて、初期値未設定状態の出力がたまたま 4199056 になっているだけです。
int64_t a=4649; のように初期値を設定してみれば、今度はその初期値がずらっと出ることになるので分かると思います。

EOFになった場合と同様、エラーになると if ( std::cin ) のように bool として評価したときに偽になります。そのままでは、以降の読み込みはできません。( スキップされます )
読み込みを続けたい場合は、std::cin.clear() によって、エラー状態をクリアしてください。
参考: https://cpprefjp.github.io/reference/ios/basic_ios/clear.html

なお、「boolとして評価したときに偽」だけだと、EOFとの区別がつきません。区別する場合は、std::cin.fail() で判定してください。
参考: https://cpprefjp.github.io/reference/ios/basic_ios/fail.html

>>の説明に、「結果がintとshortそれぞれの範囲外の値になった場合、failbitを追加する。」とあります。https://cpprefjp.github.io/reference/istream/basic_istream/op_istream.htmlの「効果」を参考に。

投稿2021/11/19 12:48

angel_p_57

総合スコア1681

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

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

fk_beginner

2021/11/19 13:51

素早い回答ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問