4

現在、変数またはリテラルを処理するときに同じ方法で暗黙的な変換を行わないVBScript(Classic ASP)のIFステートメントでの暗黙的な変換が原因で問題が発生しています。誰かがこの動作を私に説明できますか、なぜVBScriptがこのように動作するのですか?

これが私の言いたいことのサンプルです:

Const c_test = 3
Dim iId : iId = 3
Dim iTestStr : iTestStr = "3"

If iId = iTestStr Then
    Response.Write("Long variable = String variable : Equal")
Else
    Response.Write("Long variable = String variable : Not Equal")
End If

Response.Write("<br/>")

If c_test = iTestStr Then
    Response.Write("Long constant = String variable : Equal")
Else
    Response.Write("Long constant = String variable : Not Equal")
End If

Response.Write("<br/>")

If c_test = iId Then
    Response.Write("Long constant = Long variable : Equal")
Else
    Response.Write("Long constant = Long variable : Not Equal")
End If

Response.Write("<br/>")

If iId = "3" Then
    Response.Write("Long variable = String literal : Equal")
Else
    Response.Write("Long variable = String literal : Not Equal")
End If

Response.Write("<br/>")

If c_test = "3" Then
    Response.Write("Long constant = String literal : Equal")
Else
    Response.Write("Long constant = String literal : Not Equal")
End If

どの出力:

長い変数=文字列変数:等しくない

長い定数=文字列変数:等しくない

長い定数=長い変数:等しい

長い変数=文字列リテラル:等しい

長い定数=文字列リテラル:等しい

これはかなり紛らわしいo_Oです

4

2 に答える 2

4

これは、1 つの文書化された動作と 1 つの文書化されていない動作の結果です。


文書化された動作は、比較では、数値は常に文字列よりも小さいということです。これは、比較演算子のドキュメントに記載されています。ページの下部近くにある表を言い換えると、次のようになります。

一方の式が数値で、もう一方が文字列の場合、数値式は文字列式より小さくなります。


文書化されていない動作は、リテラルを含む比較が変数を含む比較とは異なる方法で処理されることです。詳細については、このブログ エントリを参照してください。重要な結論を要約すると:

関連する VB6/VBScript の比較規則は次のようになります。

  • ハード文字列 ~ ハード番号: 文字列を数値に変換し、数値を比較します
  • ハード文字列 ~ ソフト番号: 数値を文字列に変換、文字列を比較
  • ソフト文字列 ~ ハード番号: 文字列を数値に変換し、数値を比較します
  • ソフトストリング〜ソフトナンバー:任意のストリングは任意の数値よりも大きい

文書化された動作は最初の 2 つの比較が偽である理由を説明し、文書化されていない動作は最後の 2 つの比較が真である理由を説明します。

于 2012-12-09T06:26:24.617 に答える
1

変数を (暗黙的に) 宣言してAs Variantいるので、If条件は実際に 2 つVariantの s の等価性をテストし、それらが等しくないと判断します。

ただし、最後のケースでは、String定数 (Variant型なしで宣言されたとしても、 になることはありません) とStringリテラルを使用しています。

私の推測では、2 つの を比較するとVariant、VB は最初にそれらが同じ型タグを持っているかどうかを判断し、そうでない場合は に解決しFalseます。

于 2010-03-01T14:44:40.883 に答える