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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.54774 の関連記事表示

<< 0 >>
■54774  AndとAndAlsoの意義
□投稿者/ gonna -(2010/11/01(Mon) 21:53:29)

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

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

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

    なのにAndAlsoが存在するという事は、何か意味が在る様に思えて仕方が無いのですが、
    実際の所はどうなのでしょう。
親記事 /過去ログ92より / 関連記事表示
削除チェック/

■54775  Re[1]: AndとAndAlsoの意義
□投稿者/ ゆう@ -(2010/11/01(Mon) 21:59:16)
    No54774 (gonna さん) に返信
    > 必ず正しい事柄なら、AndAlsoという命令語は無くして、Andの内部構造をAndAlsoのものに
    > 変えてしまえばよいのではないでしょうか。

    ショートサーキットについてですね。
    互換性の為ではないでしょうか。
    VB6.0時代まではAndAlsoやOrElseがなく、
    VB.NETで追加されています。
    ちなみにC#.NETでは、&&や||は最初からショートサーキットになっています。
記事No.54774 のレス /過去ログ92より / 関連記事表示
削除チェック/

■54778  Re[2]: AndとAndAlsoの意義
□投稿者/ 魔界の仮面弁士 -(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
記事No.54774 のレス /過去ログ92より / 関連記事表示
削除チェック/

■54779  Re[3]: AndとAndAlsoの意義
□投稿者/ gonna -(2010/11/01(Mon) 23:29:51)
    素早い沢山のご回答ありがとうございます。

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

    では、実際に条件演算子としてAndを使うときは、必ずAndAlsoを使うほうが良いのでしょうか。
    毎回AndをAndAlsoと打つのは面倒くさい様な気がします。
記事No.54774 のレス /過去ログ92より / 関連記事表示
削除チェック/

■54781  Re[4]: AndとAndAlsoの意義
□投稿者/ shu -(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
記事No.54774 のレス /過去ログ92より / 関連記事表示
削除チェック/

■54776  Re[1]: AndとAndAlsoの意義
□投稿者/ shu -(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つになっているのでしょう。
記事No.54774 のレス /過去ログ92より / 関連記事表示
削除チェック/

■54777  Re[2]: AndとAndAlsoの意義
□投稿者/ 囚人 -(2010/11/01(Mon) 23:23:30)
    VB6 の事なんかきれいさっぱり忘れて

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

    としたら良かったのにね。正直要らんと思う。
記事No.54774 のレス /過去ログ92より / 関連記事表示
削除チェック/

■54780  Re[3]: AndとAndAlsoの意義
□投稿者/ 囚人 -(2010/11/01(Mon) 23:38:06)
    あぁなるほど。VB のビット演算のためにあるんですね。


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


    状況に依るんじゃないです? 短絡的に「必ずそうした方が良い」って考えは往々にして危険です。
    ま、AndとAndAlsoで著しく結果が違う副作用のあるコードはあまり書かない方が良いと思いますが、一般的にはAndAlsoの方が「望ましい」場面の方が多いのではないかと。
記事No.54774 のレス /過去ログ92より / 関連記事表示
削除チェック/

■54782  Re[4]: AndとAndAlsoの意義
□投稿者/ 魔界の仮面弁士 -(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 文字(&)で済むのに、
    ショートサーキットのために、倍の文字数(&&)を打つわけで。

    ……まぁ、そもそも比べるような話では無いのですが。(^^;
記事No.54774 のレス /過去ログ92より / 関連記事表示
削除チェック/

■54804  Re[5]: AndとAndAlsoの意義
□投稿者/ gonna -(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は初めからあったと思っていました。


    御蔭様でいろいろな新たな情報を得る事が出来ました。
    ご回答くださった方には感謝申し上げます。
    また困った事が出た時にはよろしくお願い致します。
記事No.54774 のレス / END /過去ログ92より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -