簡體   English   中英

區別! 和〜在c#

[英]Difference between ! and ~ in c#

當我第一次學習如何編寫程序時,我使用了C.(非常基本的命令行應用程序)在這兩種語言中你都使用了! - 操作員通常喜歡這樣:

    if(!true){
       //false..
}

我想在c#中做一些比特掩碼,我想知道'〜'運算符。

現在我有點困惑,因為在我自己的理解! 和〜應該做同樣的事情。

這適用於c#:

int i = ~0xffffffff; // i = 0
bool j = !true; // j = false

這不是:(但它確實在c中工作,並且完全符合我的預期)

int i = !0xffffffff; // i = 0

那么〜和之間的差異是什么? 他們為什么把它們分開?

C#決定將整數運算與布爾運算完全分開。 例如, if(x & 4)你必須做if((x & 4) != 0)以明確地從整數移動到布爾值。

這正符合了40年的C和它的前輩的經驗中,人們常常用它制成的錯誤,如:荷蘭國際集團是具有真值兩個值true和獲得false ,因為雖然他們其中兩個非零他們沒有共同的非零位。

C和C ++都在其歷史的后期引入了bool類型,以在表示數字或位模式的整數與我們只關心真值的值之間添加更明確的差異,但必須與舊代碼兼容。 C#擁有更加明確的奢侈品。

考慮到這一點,C#的! ~與C完全相同,只是有些東西不再有意義:

在C ! 否定真理價值。 它將0(假)變為1(真),並將所有非零(真)變為0(假)。 在C#中只對bool有意義,而不是int

在C ~產生一個補體; 它產生一個值,其中每1位變為0並且每0位變為1(例如0xFFFFFFFF變為0,0xF0F0F0F0變為0x0F0F0F0F,依此類推)。 在C#中使用int有意義,但不是bool

如果你想在C#中執行相當於!someInteger ,請執行someInteger == 0

編輯:

值得注意的是,運算符被分成“按位”('&','|'和'〜')和“boolean”('&&','||'和'!')會導致混亂。 。 這種區別並不完全正確。

現在,最后三個確實只在布爾上下文中有意義,因此C#在布爾值和整數值之間有更嚴格的分離,它們不再應用於整數。

'〜'確實在布爾上下文中沒有意義('~x',其中'x'為真將生成'x'仍為真,4294967295中有4294967294次),因此使用C#它不再適用於bools 。

'&'和'|' 保留一個布爾用途。 在'A()'和'B()'各自返回bool ,然后A() && B()只調用B()如果A()為假(即,它“短路”在執行布爾算術之前,“), A() & B()將始終調用這兩種方法。 這往往很少見,因為:

  1. 大多數時候調用B()只是浪費時間,而短路可以給我們帶來性能提升,范圍從大規模(如果B()是昂貴的)到制造 - 沒有差異 - 但是我們做了' t-lose-anything-any,所以這是習慣。(但考慮到如果B()非常便宜,無論如何調用它的成本可能比分支更便宜,特別是如果錯誤預測,請參閱下面的評論)。

  2. 有時&&是強制性的,例如x != null && x.Length != 0 ,其中不短路會在第二個參數上引發異常。

  3. 如果確保調用這兩個方法非常重要,那么在單獨的語句中更好地編寫代碼,以便向其他開發人員(或者稍后再回來時)自己清楚。

但是如果我們要討論使用布爾和整數參數的運算符之間的區別,我們應該包括布爾使用的| & ,因為它們確實出現了(有時通過拼寫錯誤!),如果人們錯誤地將“按位運算符”和“布爾運算符”分開並忘記有兩個符號同時用作兩者,它們會引起混淆。

! 是一個布爾反轉,它將一個值從true反轉為false ,反之亦然。 http://msdn.microsoft.com/en-us/library/f2kd6eb2.aspx

~是按位反轉,它反轉整數值的每一位,如int i http://msdn.microsoft.com/en-us/library/d2bd4x66.aspx

有關所有運營商的完整指南,請參閱http://msdn.microsoft.com/en-us/library/6a71f45d.aspx

之所以! ~分開是因為他們做了不同的事情。

~按位NOT運算符是一元運算符,因為它包含單個操作數。 與其他按位運算符不同,按位版本不使用與類似布爾運算符相同的符號。 為了實現一個補碼,波形符(〜)位於要修改的值的左側。

byte valueToComplement = 187;                  // 10111011  
byte complement = (byte) ~valueToComplement;   // Result = 68

! - 是一個布爾反轉,可以是true或false。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM