3
char input1;
std::cout << "input1 : ";
std::cin >> input1;

int input2;
std::cout << "input2 : ";
std::cin >> input2;

std::cout << input1 << std::endl;
std::cout << input2 << std::endl;

return 0;

input1 に「a」、input2 に「a」と書きました。

Ouput is like this.
input1 : a
input2 : a
a
-858993460

好奇心が強い...'a' チャーターは 12 月に 97 です。-858993460 と出力されるのはなぜですか? 'a' は自動的に 97 に変換されませんか? なぜ?

4

5 に答える 5

18

aintは、文字列として、以下の規則により に変換できませんstd::cin。これを考慮してください:aは基数 10 の有効な整数ではありませんstd::cin文字列 "a"int.

印刷する理由-858993460は、 が初期化されていないためです。そのためint、何かを印刷するか、何も印刷しないか、必要に応じて何でも実行できます (未定義の動作を調べます)。

代わりに次のようにしてみてください。

char input2_chr;
std::cin >> input2_chr;
int input2 = input2_chr;
于 2012-11-13T14:21:58.190 に答える
6

入力が単に失敗したと思います。表示されている値は、未定義の動作の結果です (input2書き込まれたことはありません)。

整数を読み取ろうとする場合、文字「a」は無効であるため、>>演算子によって受け入れられません。

要求した整数型の結果を得るために、入力が文字をその文字の ASCII コードに変換する必要があることを何らかの形で期待しているようです。この推論は言語によってサポートされていません。

于 2012-11-13T14:21:41.983 に答える
3

最初に、文字の入力を求めたので、ストリーム内の最初の非空白文字を取得しました。2 番目では、整数を入力するように要求したため、ストリームは空白をスキップし (常に で行われるように >>)、整数を解析しようとしました。"a"を整数値の先頭にすることはできないため、ストリームはエラー ステータス ( ) を設定し 、を変更せずfailbitに返しました。初期化されていない変数を出力すると、未定義の動作が発生します。( 入力が成功したかどうかを最初に確認せずに、入力した変数を使用しないでください。)input2

あなたの説明から、バイナリ形式を入力しようとしているようです。これを行うには、ストリームをバイナリ モードで開き、ストリームに"C"ロケールが組み込まれていることを確認してから、 istream::getまたはを使用する必要がありistream::readます。(もちろん、読み取ったフォーマットされていないバイトを必要な実際の情報に変換できるようにするために、読み取っているバイナリ形式が何であるかを知る必要があります。)

于 2012-11-13T14:27:23.610 に答える
3

たとえば、 Aardvard が既に答えたように、入力操作が失敗し、新しい値が割り当てられなかったため、C++ 標準ではindeterminate valueと呼ばれる任意の元の値が表示されます。input2

変数の値の 10 進数表現を出力するにはchar、単純に変換してint、出力ストリームが整数として扱われるようにします。

これを変換する最も簡単な方法intは、変数の前に記号を追加するなど、式で変数を使用して暗黙的な昇格を促進することです。+

#include <iostream>
using namespace std;

int main()
{
    char const  ch  = 'a';
    cout << "'" << ch << "' = " << +ch << endl;
}

出力:

'a' = 97
于 2012-11-13T14:34:08.833 に答える
2

input2 で整数を読み取っているためです。a整数ではありません。したがって、何も読み込まれず、 の元の値input2が保持されます。

この場合、input2初期化されていないため、ランダムな値になります。

チェックすることで、読み取りが成功したかどうかを確認できますcin.good()

于 2012-11-13T14:22:18.703 に答える