C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: AndとAndAlsoの意義


(過去ログ 92 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■54774 / inTopicNo.1)  AndとAndAlsoの意義
  
□投稿者/ gonna (64回)-(2010/11/01(Mon) 21:53:29)

分類:[VB.NET/VB2005 以降] 

VBの話ですが、VBにはAndとAndAlsoが有りますよね。
AndAlsoはAndを効率化した物、And以前に偽ならば即刻偽と帰してしまうすぐれものらしいです。

ここで一つ疑問が生まれました。
「And以前に偽ならば即刻偽と帰してしまう」と云う事がどの様な状況に対しても
必ず正しい事柄なら、AndAlsoという命令語は無くして、Andの内部構造をAndAlsoのものに
変えてしまえばよいのではないでしょうか。

なのにAndAlsoが存在するという事は、何か意味が在る様に思えて仕方が無いのですが、
実際の所はどうなのでしょう。
引用返信 編集キー/
■54775 / inTopicNo.2)  Re[1]: AndとAndAlsoの意義
□投稿者/ ゆう@ (3回)-(2010/11/01(Mon) 21:59:16)
No54774 (gonna さん) に返信
> 必ず正しい事柄なら、AndAlsoという命令語は無くして、Andの内部構造をAndAlsoのものに
> 変えてしまえばよいのではないでしょうか。

ショートサーキットについてですね。
互換性の為ではないでしょうか。
VB6.0時代まではAndAlsoやOrElseがなく、
VB.NETで追加されています。
ちなみにC#.NETでは、&&や||は最初からショートサーキットになっています。
引用返信 編集キー/
■54776 / inTopicNo.3)  Re[1]: AndとAndAlsoの意義
□投稿者/ shu (142回)-(2010/11/01(Mon) 22:37:17)
2010/11/01(Mon) 23:37:24 編集(投稿者)
No54774 (gonna さん) に返信
> VBの話ですが、VBにはAndとAndAlsoが有りますよね。
> AndAlsoはAndを効率化した物、And以前に偽ならば即刻偽と帰してしまうすぐれものらしいです。
> 
> ここで一つ疑問が生まれました。
> 「And以前に偽ならば即刻偽と帰してしまう」と云う事がどの様な状況に対しても
> 必ず正しい事柄なら、AndAlsoという命令語は無くして、Andの内部構造をAndAlsoのものに
> 変えてしまえばよいのではないでしょうか。
> 
> なのにAndAlsoが存在するという事は、何か意味が在る様に思えて仕方が無いのですが、
> 実際の所はどうなのでしょう。
A and B => AもBも必ず評価される。つまりA,Bが関数の呼び出しであればAによる副作用と
Bによる副作用は結果にかかわらず起こる。

A andalso B => Aを評価してFalseならBは評価されない。つまりAの評価結果によりBによる
副作用を発生させる事ができない。

という違いがあります。評価による副作用がなければandの実装をandalsoにする事も出来るのでしょうけど
前者のような組み方は出来なければならないので(それが良い方法かは別として)2つになっているのでしょう。

引用返信 編集キー/
■54777 / inTopicNo.4)  Re[2]: AndとAndAlsoの意義
□投稿者/ 囚人 (553回)-(2010/11/01(Mon) 23:23:30)
VB6 の事なんかきれいさっぱり忘れて

>必ず正しい事柄なら、AndAlsoという命令語は無くして、Andの内部構造をAndAlsoのものに
変えてしまえばよいのではないでしょうか。

としたら良かったのにね。正直要らんと思う。
引用返信 編集キー/
■54778 / inTopicNo.5)  Re[2]: AndとAndAlsoの意義
□投稿者/ 魔界の仮面弁士 (1905回)-(2010/11/01(Mon) 23:25:38)
No54775 (ゆう@ さん) に返信
> VB6.0時代まではAndAlsoやOrElseがなく、
> VB.NETで追加されています。
> ちなみにC#.NETでは、&&や||は最初からショートサーキットになっています。

C# でも、「bool値 & bool値」や「bool値 | bool値」構文を使えば、
VB でいうところの And / Or の動作になりますね。


And / & 演算子 や Or / | 演算子は、整数ビット演算を行う論理演算子としての働きがありますが、
AndAlso / && や OrElse / || 演算子はビット演算には使えません。条件演算子としては使えますが。

そしてビット演算ではショートサーキット(短絡演算)を行うわけにはいきませんので、
VB で And / Or 演算子を廃止されてしまうと、それはそれで困ったことになると思います。

もちろん、旧 VB 時代の互換性維持という理由もあったのでしょうけれどね。
http://msdn.microsoft.com/ja-jp/library/wz3k228a%28VS.80%29.aspx
引用返信 編集キー/
■54779 / inTopicNo.6)  Re[3]: AndとAndAlsoの意義
□投稿者/ gonna (65回)-(2010/11/01(Mon) 23:29:51)
素早い沢山のご回答ありがとうございます。

> And / & 演算子 や Or / | 演算子は、整数ビット演算を行う論理演算子としての働きがありますが、
> AndAlso / && や OrElse / || 演算子はビット演算には使えません。条件演算子としては使えますが。
> そしてビット演算ではショートサーキット(短絡演算)を行うわけにはいきませんので、
> VB で And / Or 演算子を廃止されてしまうと、それはそれで困ったことになると思います。
成るほどです。
これで何故AndAlsoが用意されているか理解する事が出来ました。

では、実際に条件演算子としてAndを使うときは、必ずAndAlsoを使うほうが良いのでしょうか。
毎回AndをAndAlsoと打つのは面倒くさい様な気がします。
引用返信 編集キー/
■54780 / inTopicNo.7)  Re[3]: AndとAndAlsoの意義
□投稿者/ 囚人 (554回)-(2010/11/01(Mon) 23:38:06)
あぁなるほど。VB のビット演算のためにあるんですね。


>では、実際に条件演算子としてAndを使うときは、必ずAndAlsoを使うほうが良いのでしょうか。
>毎回AndをAndAlsoと打つのは面倒くさい様な気がします。


状況に依るんじゃないです? 短絡的に「必ずそうした方が良い」って考えは往々にして危険です。
ま、AndとAndAlsoで著しく結果が違う副作用のあるコードはあまり書かない方が良いと思いますが、一般的にはAndAlsoの方が「望ましい」場面の方が多いのではないかと。
引用返信 編集キー/
■54781 / inTopicNo.8)  Re[4]: AndとAndAlsoの意義
□投稿者/ shu (143回)-(2010/11/02(Tue) 00:03:32)
No54779 (gonna さん) に返信

決して良いコーディングではありませんが、挙動が異なる例です。
あくまで同じ動きをするものではないということを示すための例です。

・Button1のクリックでは必ずCountUpが呼ばれるのでchkUpdateLabelがチェックされていない時でも
m_intClickCntの値が変わります。
・Button2のクリックではchkUpdateLabelがチェックされていないとCountUpが呼ばれないのでchkUpdateLabelが
チェックされたときにしかm_intClickCntの値が変わりません。

Public Class Form1

    Private m_intClickCnt As Integer

    Sub New()
        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        m_intClickCnt = 0
    End Sub

    Private Function CountUp() As Boolean
        m_intClickCnt += 1
        If m_intClickCnt = 10 Then
            m_intClickCnt = 0
            Return False
        Else
            Return True
        End If
    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If chkUpdateLabel.Checked And CountUp() Then
            Label1.Text = m_intClickCnt.ToString
        End If
    Label2.Text = m_intClickCnt.ToString
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        If chkUpdateLabel.Checked AndAlso CountUp() Then
            Label1.Text = m_intClickCnt.ToString
        End If
    Label2.Text = m_intClickCnt.ToString
    End Sub
End Class

引用返信 編集キー/
■54782 / inTopicNo.9)  Re[4]: AndとAndAlsoの意義
□投稿者/ 魔界の仮面弁士 (1906回)-(2010/11/02(Tue) 00:27:17)
No54780 (囚人 さん) に返信
> あぁなるほど。VB のビット演算のためにあるんですね。

歴史的な経緯からいえば、かつての VB の And / Or 演算子には、
「ビット演算子」としての意味しかありませんでした。

というよりも、VB2 の頃はそもそも Boolean 型すら無かったのです。

当時から、True / False というキーワードはあったのですが、
それらを Variant 型に格納した場合、False は Integer 型の 0、
True は -1 で管理されました。

2進数 00000000 00000000 すなわち 0 を Not で反転させた場合、
2進数 11111111 11111111 となり、これを符号付き整数としてみると、
-1 という値になるからですね。


で、この当時の流れを受け継いでいるが故に、VB4 以降になっても、処理的には
And / Or はビット演算子として動作していた(ので短絡評価できない)ようです。

で。それが見直されたのが VB.NET からである、と。

# .NET 1.0 の開発段階では、はじめはショートサーキットで実装してみたのだけれども、
# 互換性の点でデメリットが多かったので、結局現在の実装に落ち着いたと聞いています。


>>では、実際に条件演算子としてAndを使うときは、必ずAndAlsoを使うほうが良いのでしょうか。
> ま、AndとAndAlsoで著しく結果が違う副作用のあるコードはあまり書かない方が良いと思いますが、
> 一般的にはAndAlsoの方が「望ましい」場面の方が多いのではないかと。
同感です。


>>毎回AndをAndAlsoと打つのは面倒くさい様な気がします。
極端な言い方をしてしまえば、そこの事情は C# も同じだったりします。

論理ビット演算なら 1 文字(&)で済むのに、
ショートサーキットのために、倍の文字数(&&)を打つわけで。

……まぁ、そもそも比べるような話では無いのですが。(^^;
引用返信 編集キー/
■54804 / inTopicNo.10)  Re[5]: AndとAndAlsoの意義
□投稿者/ gonna (66回)-(2010/11/02(Tue) 20:07:33)
>・Button1のクリックでは必ずCountUpが呼ばれるのでchkUpdateLabelがチェックされていない時でも
m_intClickCntの値が変わります。
>・Button2のクリックではchkUpdateLabelがチェックされていないとCountUpが呼ばれないのでchkUpdateLabelが
チェックされたときにしかm_intClickCntの値が変わりません。

なるほどです。関数の場合は実行されるかされないかという違いが出るのですね。


> 当時から、True / False というキーワードはあったのですが、
> それらを Variant 型に格納した場合、False は Integer 型の 0、
> True は -1 で管理されました。
> 2進数 00000000 00000000 すなわち 0 を Not で反転させた場合、
> 2進数 11111111 11111111 となり、これを符号付き整数としてみると、
> -1 という値になるからですね。

てっきりBooleanは初めからあったと思っていました。


御蔭様でいろいろな新たな情報を得る事が出来ました。
ご回答くださった方には感謝申し上げます。
また困った事が出た時にはよろしくお願い致します。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -