2011-07-22 59 views
2
class Program 
{ 
    private static bool _ret = true; 

    static void Main() 
    { 
     _ret &= Method(); 
     Console.WriteLine(_ret); 
     Console.Read(); 
    } 

    private static bool Method() 
    { 
     _ret &= false; 
     return true; 
    } 
} 

我們在開發一個更大的應用程序時遇到過這個問題,並且想知道它是否是預期的功能?這是用C#和Visual Studio 2010爲什麼_ret評估爲真,不應評估爲假(位操作員)?

+6

嗯,因爲它會調用'回報TRUE'? – Nemo

+0

@Nemo:太棒了。 –

+0

這是什麼,我什至不.. –

回答

2

如在他的博客 「優先級VS結合性VS訂單」 解釋由埃裏克利珀,

表達F()+ G()* H()等效於F()+(G( )* H()),但是在F()之前,C#不會評估G()* H()。相反,這相當於 到:

temp1 = F();

temp2 = G();

temp3 = H();

temp4 = temp2 * temp3;

result = temp1 + temp4;

因此,在您的情況下,它會在調用Method()之前評估_ret,並且_ret在Method()內發生更改的事實不會影響外部調用。

參見:http://blogs.msdn.com/b/ericlippert/archive/2008/05/23/precedence-vs-associativity-vs-order.aspx

2

我敢打賭,_ret & =()方法轉換爲_ret = _ret &()的方法,並在RHS的_ret方法之前正在評估()被調用。

由於_ret最初是真的,這是真的,當它評估_ret在RHS,然後_ret更改爲false在()的方法,但是,這並不重要,因爲()方法返回true,真&真=真。

這可能是編譯器/環境特定的......它依賴於從左到右的評估,這是你不應該指望的。

+0

這有助於瞭解這是哪種語言。如果它是Java,那麼就不應該有「編譯器特定」之類的東西。 –

+0

+1「它依賴於從左到右的評估,這是你不應該指望的。」 –

+0

@Kerrek:沒錯,但無論如何,他不應該認爲這個代碼在翻譯成例如C++,Python或Ada。 – Patrick87

0

你的方法返回shoule像下面

private static bool Method() 
    { 
     return _ret &= false; 
    }