ホームページ > バックエンド開発 > C++ > C 11 で抽出失敗時に「stringstream >>」が変数をゼロにするのはなぜですか?

C 11 で抽出失敗時に「stringstream >>」が変数をゼロにするのはなぜですか?

Patricia Arquette
リリース: 2024-11-26 12:57:11
オリジナル
647 人が閲覧しました

Why Does `stringstream >>` C 11 での抽出失敗時に変数をゼロにしますか?
>` C 11 での抽出失敗時に変数をゼロにしますか? " />

なぜ Stringstream >> は失敗時にターゲットの値を変更するのですか?

最新の C (C 11 以降) では、>> ; 抽出が失敗した場合の stringstream の演算子が以前のバージョンから変更され、C 11 標準に従って、失敗するとターゲット変数が に設定されます。

C 11 より前では、「TC PL、第 3 版」からの Stroustrup の引用によれば、障害時の動作は異なっていました。変数は変更されないままである必要があります。ただし、提供されているコード例では矛盾が示されており、抽出試行が失敗した後にターゲット変数 v がゼロになります。

これ明らかに矛盾した動作は、スニペットが C 11 モードでコンパイルされているため、>> 演算子の動作が次のように変更されるという事実によって説明できます。データ型 (例: ワードを整数に読み取ろうとする場合)、ターゲット変数は変更されず、フェイルビット フラグが設定されます。

    抽出の場合ターゲットの型に対して値が大きすぎるか小さすぎるために失敗した場合、可能な最大値または最小値 (たとえば、整数の std::numeric_limits::max()) が変数に書き込まれ、failbit フラグが設定されます。
  • コード例では、stringstream に整数に変換できない文字列が含まれているため、解析が失敗します。 C 11 モードでは、出力に見られるように、この障害により v が 0 に設定されます。 「state:failbit」メッセージで示されるように、failbit フラグも設定されます。
この動作の変更は、ストリーム エクストラクターの抽出失敗の処理の一貫性を確保するために C 11 で導入されました。これは、ストリーム抽出プログラムは、障害が発生した場合に (可能であれば) ターゲット変数を変更すべきではないという一般原則と一致します。

以上がC 11 で抽出失敗時に「stringstream >>」が変数をゼロにするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート