12

これは、私の仲間のチームメンバーが少し熱く議論していた興味深いコードです...

  Dim fred As Integer

  If True Then fred = 5 : fred = 3 : fred = 6 Else fred = 4 : fred = 2 : fred = 1

上記のコード スニペットを実行した後、fredの値は?

コードをだましてデバッグしないようにしてください。

これは非常に不自然なコード例で、最初は If ステートメントでコロンを使用する例として作成されましたが、誰かがfredの結果を提供することを自分で決めました。

更新: 通常、このようなコードは記述しません。このスニペットは単なる例です。たまたま、この質問は、私たちのチームのコーディング標準文書の作成に関する議論から生まれました。

4

5 に答える 5

16

VB.Net のことだと思います。

ここで読むことができるVB言語仕様の文法によると:

http://www.microsoft.com/Downloads/thankyou.aspx?familyId=39de1dd0-f775-40bf-a191-09f5a95ef500&displayLang=en

結果は「6」になるはずです。

これは、「line if ステートメント」の文法が次のとおりであるためです。

If  BooleanExpression  Then  Statements  [  Else  Statements  ]  StatementTerminator

そして「ステートメント」は次のように定義されます

Statements  ::=
[  Statement  ]  |
Statements  :  [  Statement  ]

編集: コードのデバッグは「不正行為」ではないことに注意してください。

私はマイクロソフトの VB コンパイラ チームで働いていました。

仕様があいまいだったり、実際に出荷したものと一致しないこともありました。これらのケースのいくつかでは、解決策 (それを修正するために私たちが行ったこと) は常に「まあ...コンパイラは今何をしているのか」に基づいていました。

コンパイラを変更することもあれば、仕様を変更することもあります。

ただし、決定を下す前に、常にコンパイラを実行して、実際に何が行われたかを確認していました。

だから...コードをデバッグすることは、それが何をするかを理解することの大きな部分です...

于 2008-12-15T02:25:46.523 に答える
3

しばらく BASIC をあまり使っていなかったので、これは単なる推測ですがfred6.

率直に言って、コードはあまり読みやすくありません。すべてを 1 行に収めるのではなく、インデントを使用すると、コードが読みやすくなると思います。

Dim fred As Integer

If True Then
    fred = 5
    fred = 3
    fred = 6
Else
    fred = 4
    fred = 2
    fred = 1
End If

私が間違っていなければ、それは同等のコードだと思います。

しかし、コードが同等でない場合、それは別のポイントをもたらします: 元のコードは、それが言っているように見えることが実際に起こっていることとはまったく異なるという点で「トリッキー」です。C スタイル言語のトラップに似ています。

if (condition)
    do_something();
    do_other_thing();

do_somethingコードは、が true の場合にanddo_other_thingが実行されることを暗示しているように見えconditionますが、実際にdo_other_thingは常に実行されます。

コードの意図をより明確にし、あいまいさを軽減するコーディング スタイルを順守することをお勧めします。

于 2008-12-15T02:25:50.800 に答える
2

最終結果は 6 です。
ここでの本当の質問は次のとおりです。どのようにして私のリポジトリにアクセスしたのですか?
:-)

于 2008-12-15T04:39:42.587 に答える
0

非常に古い BASIC 方言では、"THEN" の後に続けられるのは行番号だけでした。多くの方言は、コードが「THEN」に従うことを許可することで、これを改善しました。「THEN」を過ぎて解析した後、示された条件が false の場合は次の行にスキップし、そうでない場合は現在の行に進みます。さらに方言により、行末または「ELSE」のどちらか早い方までスキップする機能が追加されました。「ELSE」ステートメントを実行しようとすると、行末までスキップされます。

QuickBasic が導入されたとき、複数行の if/then/else ブロックのサポートが追加されましたが、古いスタイルのアプローチのサポートは維持されました。Visual Basic はそれに続き、vb.net は伝統を継承しています。

于 2011-03-04T21:18:54.740 に答える
0

ただの推測

fred = 6 は、コロンで区切られた同じ行に複数のステートメントを含めることができるためです。

「else」が有効かどうか(つまり、コンパイル可能かどうか)不明

IMHO より良いコーディング スタイルを選択する必要があります。


if (condition) then
  statement
  statement
else
  statement
  statement
end if
于 2008-12-15T02:23:23.847 に答える