среда, ноября 17, 2010

Оказывается - 5

… что и MSDN не всегда говорит правду.

Например, читаем

An expression using the &= assignment operator, such as

x &= y

is equivalent to

x = x & y 

На практике оказывается, что эквивалентность для логических операндов наблюдается только в приведённом примере:

class AndAssignment
{
static void Main()
{
bool b = true;
b &= false;
Console.WriteLine(b);
}
}
/*
Output:
False
*/

Если же операнд y является вызовом какой-либо процедуры, то оператор &= эту процедуру вызывает всегда, независимо от значения x.

2 комментария:

  1. >> Если же операнд y является вызовом какой-либо процедуры, то оператор &= эту процедуру вызывает всегда, независимо от значения x.
    А оператор & как то зависит от x? У меня как то не получилось такого эффекта добиться. Объясните :)

    bool y()
    {
    Console.WriteLine(@"I'm in y!");
    return true;
    }

    void t1()
    {
    bool x = false;
    x = x & y();
    Console.WriteLine(String.Format(@"x = {0}", x));
    }

    void t2()
    {
    bool x = true;
    x = x & y();
    Console.WriteLine(String.Format(@"x = {0}", x));
    }

    void t3()
    {
    bool x = false;
    x &= y();
    Console.WriteLine(String.Format(@"x = {0}", x));
    }

    void t4()
    {
    bool x = true;
    x &= y();
    Console.WriteLine(String.Format(@"x = {0}", x));
    }

    void Main()
    {
    t1();
    t2();
    t3();
    t4();
    }

    /*
    Output:
    I'm in y!
    x = False
    I'm in y!
    x = True
    I'm in y!
    x = False
    I'm in y!
    x = True
    */

    ОтветитьУдалить
  2. Вот мой тест:
    private static bool tr() {
    Console.WriteLine("set true");
    return true;
    }
    private static bool fa() {
    Console.WriteLine("set false");
    return false;
    }
    internal static void TestAnd() {
    Console.WriteLine("&& :");
    bool qq = fa();
    qq = qq && tr();
    Console.WriteLine("Result={0}", qq);
    Console.WriteLine("&= :");
    qq = fa();
    qq &= tr();
    Console.WriteLine("Result={0}", qq);
    }
    /*
    && :
    set false
    Result=False
    &= :
    set false
    set true
    Result=False
    */

    В первом случае вторая функция не вызывается, что и правильно.

    ОтветитьУдалить