コードが「cout」になるのはなぜですか

Mary-Kate Olsen
リリース: 2024-11-05 17:20:02
オリジナル
970 人が閲覧しました

Why does the code `cout

C でのポスト インクリメントと出力の動作

この記事では、出力ストリームのコンテキスト内での C でのポスト インクリメント演算子の動作について説明します。場合によっては、ポストインクリメント操作によって予期しない結果が生じる可能性があります。

問題

次のコード スニペットを考えてみましょう。

<code class="cpp">#include <iostream>
using namespace std;

main() {
    int i = 5;

    cout << i++ << i-- << ++i << --i << i << endl;
}</code>
ログイン後にコピー

このコードの出力は次のとおりです。シーケンス「45555」は、一見すると意外に思えるかもしれません。後置インクリメント演算子 (i ) は、式で使用された後に変数の値をインクリメントし、最初の出力の結果が「4」になります。ただし、次のポスト デクリメント演算子 (i--) は、変数を直ちにデクリメントして元の値に戻し、2 番目の出力として「5」が生成されます。同じパターンが続き、変数値がさらに 2 回インクリメントされてからデクリメントされ、最終出力として「555」が得られます。

ポスト インクリメントについて

ポストC のインクリメント演算子は、式で使用された変数の値をインクリメントする単項演算子です。これは、演算子が適用された後、変数の値が 1 ずつ増加することを意味します。上記のコード スニペットでは、変数が出力ストリーム (cout << i) で使用された後にポスト インクリメント演算子 (i ) が使用されます。

引数の順序なし評価

単一の式内の複数のポストインクリメント/デクリメント操作の動作は、引数の順序なしの評価の対象となります。これは、演算子の引数が評価される順序が C 標準では指定されていないことを意味します。結果として、そのような式の出力は未定義であり、コンパイラの特定の実装によって異なる場合があります。

未定義の動作

コード スニペットの場合ただし、ポストインクリメント演算子とポストデクリメント演算子の評価順序は定義されていません。これにより、予期しない予測不可能な出力が発生します。このようなコードは未定義の動作を示します。つまり、コンパイラは、コンピュータに火をつけるなど、適切と思われる出力を自由に生成できます (冗談です)。

未定義の動作を避ける

未定義の動作を示すコードの作成は、一貫性がなく信頼性の低い結果につながる可能性があるため、避けることが重要です。ポストインクリメント/デクリメント演算子を使用するときに未定義の動作を回避するには、演算子の間にシーケンス ポイントがあることを確認してください。シーケンス ポイントは、次の式の評価が開始される前に、前の式のすべての副作用が完了するコード内のポイントです。

以上がコードが「cout」になるのはなぜですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!