… что и 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 комментария:
>> Если же операнд 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
*/
Вот мой тест:
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
*/
В первом случае вторая функция не вызывается, что и правильно.
Отправить комментарий