プロが教えるわが家の防犯対策術!

こんばんは

多くの言語では、変数a、b、cに対して下記のようにすると
a = b = c = 10
右から代入されるので、a,b,cともに10となります。

しかし、VBA(VBも?)の場合、代入はされませんが、エラーは出ずに処理は進みます。

以下にサンプルコードを示しますが、何故a,b,cがデバッグで表示されるような結果になるのかがわかりません。詳しい方いらっしゃいましたらご教授お願いします

Sub hoge()
Dim a, b, c
a = 2
b = 3
c = 4

a = b = c = 1 'ここで、a,b,cに対してどのような処理が行われているのだろうか?

Debug.Print a '→False
Debug.Print b '→3
Debug.Print c '→4
End Sub


aがFalseなのは、aとbを比較しているんだなと思いますが、b,cについてはどのような処理が行われているのか、さっぱりわかりません

A 回答 (3件)

まずはこちら。



演算子の優先度
https://msdn.microsoft.com/ja-jp/vba/language-re …

| 比較演算子はすべて同じ優先順位を持っています。つまり、比較演算子は出現した順序に従って左から右へと評価されていきます。

ということで、

a = b = c = 1

a = ((b = c) = 1)
と等価です。

まず b = c が評価され False(すなわち 0)
その結果(0) と 1 の比較 (0 = 1) を 評価し、
結果の False を a に代入しています。

a = b = c = 0
の場合
(0 = 0) の評価を代入しますから
a は True になります。

サッカー見ないの?
    • good
    • 0
この回答へのお礼

ご回答有り難うございます
気になってサッカーも見られません!

お礼日時:2018/06/25 12:50

> 多くの言語では、変数a、b、cに対して下記のようにすると


> a = b = c = 10
> 右から代入されるので、a,b,cともに10となります。

となるプログラミング言語では
= は「代入演算子」と言って、「代入を行った上で、その代入した値を返す」という計算をします。
a=b=c=10は
a=(b=c=10)
a=(b=(c=10))
と解釈され、c=10が「計算」されて
a=(b=10)
a=10
となります。



ところが、VBA (や、もともとのBASIC)では
代入の = は「変数 = 〜」という「代入文」の書式の一部です。
それ以外の= は「比較演算子」という「2つの値を比較して、 = だったら 真、そうでなかったら偽」を返す計算をします。

a=b=c =10 は「b=c=10 の計算結果を a に代入する」という代入文になります。
b=c=10が falseになるのは、No2にあるような順番で 比較演算子=の計算が実行されるからです。
    • good
    • 0
この回答へのお礼

ご回答有り難うございます。
自分でもネットで調べて解決しました

a = b = c = 10 という式は
①b = cの比較演算が行われる( trueなら-1、falseなら0)
②①の結果と10の比較演算が行われる( 10は②がtrueだろうが、falseだろうが一致しないので、結果はfalse )
③②の結果がaに代入される

ということですね。

お礼日時:2018/06/25 12:54

falseが発生した時点で以降の処理はスキップされるので、初期値がそのまま出てくる

    • good
    • 0
この回答へのお礼

a=4
b=4
c=4
と宣言し

a=b=c=4
も質問のような結果になるのですが、何故でしょうか?

お礼日時:2018/06/25 00:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!