タグ付けされた質問 「sequence-points」

5
未定義の動作とシーケンスポイント
「シーケンスポイント」とは何ですか? 未定義の動作とシーケンスポイントの関係は何ですか? a[++i] = i;気分を良くするために、のように面白い複雑な表現をよく使用します。それらの使用をやめるべきなのはなぜですか? これを読んだ場合は、フォローアップの質問Undefined behavior and sequence points reloadedにアクセスしてください。 (注:これは、Stack OverflowのC ++ FAQへのエントリになることを目的としています。このフォームでFAQを提供するという考えを批評したい場合は、これをすべて開始したメタへの投稿がそのための場所になります。回答その質問は、C ++チャットルームで監視されます。ここでは、FAQのアイデアが最初から始まっているため、アイデアを思いついた人があなたの答えを読む可能性が非常に高くなります。


5
未定義の動作とシーケンスポイントがリロードされました
このトピックを次のトピックの続編と考えてください。 前の記事 未定義の動作とシーケンスポイント この面白くて複雑な表現をもう一度見てみましょう(イタリック体のフレーズは上記のトピック* smile *から取られています): i += ++i; これは未定義の振る舞いを引き起こすと言います。これを言うとき、私たちは暗黙のうちにタイプが組み込みタイプのi1つであると仮定していると思います。 の型がiユーザー定義型の場合はどうなりますか?そのタイプはIndex、この投稿の後半で定義されていると言います(以下を参照)。それでも未定義の振る舞いを呼び出しますか? はいの場合、なぜですか?それは書くことと同等ではありませんi.operator+=(i.operator++());か、あるいは構文的に単純 i.add(i.inc());ですか?または、それらも未定義の振る舞いを呼び出しますか? いいえの場合、なぜですか?結局のところ、オブジェクトiは連続するシーケンスポイント間で2回変更されます。経験則を思い出してください。式は、連続する「シーケンスポイント間でオブジェクトの値を1回だけ変更できます。また、i += ++iが式の場合 、undefined-behaviorを呼び出す必要があります。その場合、同等のものi.operator+=(i.operator++());で i.add(i.inc());あり、undefined-behaviorも呼び出す必要があります。真実ではないようです!(私が理解している限り) または、i += ++iそもそも表現ではないですか?もしそうなら、それは何ですか、そして表現の定義は何ですか? それが式であると同時に、その動作も明確に定義されている場合、式に関連付けられているシーケンスポイントの数は、式に含まれるオペランドのタイプに何らかの形で依存することを意味します。私は(部分的にでも)正しいですか? ちなみに、この表現はどうですか? //Consider two cases: //1. If a is an array of a built-in type //2. If a is user-defined type which overloads the subscript operator! a[++i] = i; …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.