2010-02-23 21 views
11

我一直在使用! (邏輯否定)在C和其他語言,我很好奇,有誰知道如何使自己的!功能?或者有創造性的方法來製作一個?邏輯否定在C中如何工作?

+2

當你談論「!方法」時,聽起來好像你可能在談論C++。你可以編寫一個在C中進行邏輯否定的函數,但是你不能覆蓋!運營商。 C++允許你編寫一個操作符! - 無論是方法還是非成員函數 - 但這是C++,而不是C. – Steve314 2010-02-23 16:23:13

+0

這並不像我想的那樣容易找到標準部分的問答,如果輸入'!'返回1是0(與編譯器相關的任何其他非零值相反),但它是[C99標準6.5.3.3](http://stackoverflow.com/questions/7945950/is-logical-negation-of-零-O-編譯器從屬在-C)。只是FYI。 – HostileFork 2014-10-24 03:03:58

回答

21
int my_negate(int x) 
{ 
    return x == 0 ? 1 : 0; 
} 
+1

這是更好:) – 2010-02-23 16:20:39

+1

不能相信我設法搞砸了:-p – 2010-02-23 16:21:50

+0

所有的時間對我來說。我會寫點東西,但實際上意味着完全相反。 – 2010-02-23 16:26:05

6

!e可以通過((e)?0:1)

1

如果你想重載一個操作者更換,適當的原型爲:

bool operator!(); 

我不超載運營商的大風扇,但一些人們喜歡他們的語法糖。編輯:這只是C++!把它放在你班級的定義中。

+0

重載操作符可以很好地處理模板。只要確保你的'operator!()'與'!'具有相同的語義。 – 2010-02-23 16:30:13

+0

如果你把它放在類定義中,它不需要任何參數並在*這個上運行。 bool operator!()const;您展示的原型可用於朋友操作員定義。 – 2010-02-23 16:38:22

+0

對。良好的使用情況下,超載運營商。但是,如果你沒有那麼好的理由,那麼操作員通常不像一個有名的功能那麼直觀。雖然總是有例外。 – thebretness 2010-02-23 16:39:58

5

記住爆炸操作符'!'或用英語說法中的感嘆號,被編入程序語言中作爲否定的手段。

考慮這個三元運算符例如:

 
(some condition) ? true : false; 

現在,如果被否定,三元運算符將這個

 
(some condition) ? false : true; 

的公共區域,能夠得到一些程序員在一點一個合適的是strcmp函數,對於相同的字符串返回0,對於兩個字符串1不相同:

 
if (strcmp(foo, "foo")){ 

} 

當它實際上應該是:

 
if (!strcmp(foo, "foo")){ 
} 

一般來說,當你否定,這是相反的,如圖三元運算符例子...

希望這有助於。

+0

'strcmp'返回字符串相同的0;如果第一個字符串在第二個字符串之前,它將返回一個負數(不一定是-1),如果第一個字符串在第二個字符串之後,則返回一個正數(不一定是+1) - 其中的排序基於(無符號)組成字符串的字符。 – 2010-02-23 16:28:55

+0

@Jonathan:正確,-1被認爲是真的.....因爲它是最大的無符號整數......即。 0xFFFF的...即。非零,無論何時-'ive或+'ive – t0mm13b 2010-02-23 16:36:36

+0

您的答案狀態'strcmp函數,它返回0爲字符串是相同的,1爲兩個字符串不相同'。這是不正確的;它會爲兩個不相同的字符串返回非零值,而不是'如果字符串不同,則無條件地返回1'。 – 2010-02-23 18:42:47

3

C將所有非零值視爲「true」和零「false」。邏輯否定是通過檢查零來完成的。如果輸入正好爲零,則輸出一個非零值;否則,輸出零。在代碼中,您可以將其編寫爲(input == 0) ? 1 : 0(或者將其轉換爲if語句)。

當你問「如何做自己的方法」時,你的意思是你想編寫一個否定邏輯值的函數,或者你想定義感嘆號操作符的作用嗎?如果前者,那麼我上面發佈的聲明就足夠了。如果是後者,那麼恐怕這是C中不能完成的事情。C++支持運算符重載,如果這樣做是嚴格的必要條件,那麼我會建議在那裏尋找。