gcc 4.4.4 c89定義對象宏
我在某些代碼中看到了這種情況。
#define FALSE 0
#define TRUE (!FALSE)
有書面以下任何區別:
#define FALSE 0
#define TRUE 1
它的一些功能被這樣使用:
if(condition failed) {
return FALSE;
}
else {
return TRUE;
}
非常感謝您的任何建議,
gcc 4.4.4 c89定義對象宏
我在某些代碼中看到了這種情況。
#define FALSE 0
#define TRUE (!FALSE)
有書面以下任何區別:
#define FALSE 0
#define TRUE 1
它的一些功能被這樣使用:
if(condition failed) {
return FALSE;
}
else {
return TRUE;
}
非常感謝您的任何建議,
一個區別是,在(!FALSE)
情況下,如果你改變:
#define FALSE 0
到
#define FALSE 1
你的程序仍然是 「作品」,而無需修改TRUE ......然而,這是不太可能的,因爲我相信你的程序依賴於構造,如
if (funtion_that_returns_FALSE()) {
}
如果更改FALSE
的定義,會中斷。不要改變它:)
的C「如果」語句將零解釋爲錯誤,並且絕對是完全正確的。所以,你使用TRUE的價值並不重要,儘管1是常規的。
但無論如何(!0)== 1所以這不應該改變任何東西。
>> cat joe.c
#include <stdlib.h>
#define FALSE 0
#define TRUE (!FALSE)
int main (int argc, char * argv[]) {
printf("false %d\ntrue %d\n", FALSE, TRUE);
return 0;
}
>> cc joe.c
>> ./a.out
false 0
true 1
>>
編輯:我向後讀了問題。抱歉。由於TRUE爲!FALSE且FALSE爲0,因此TRUE爲1.
無論如何,編譯器會將FALSE評估爲0,因爲它會看到(!1),它在運行時沒有意義進行計算。
這只是愚蠢的。
在c中,任何不爲零爲真。這正是代碼所代表的。我不認爲這很愚蠢,實際上它可能比任意選擇真實價值更爲理智。 – Stephen 2010-06-29 16:30:18
@Stephen:1不是任意值。 C中的布爾值評估返回0代表假或1代表真。因此用1來定義TRUE是非常有意義的。當然,使用!0(它是1)對於事實有點更明確,但是如果你需要在這裏清楚地提醒這些基本事實,那麼無論如何,作爲一名C程序員你都會過着危險的生活。 ;) – Secure 2010-06-29 16:42:46
@Secure:我當然同意取決於這些細節是走在危險的路線:)也許任意性是我的一個糟糕的選擇。我的觀點是,如果(c)'只評估'else'分支,如果'c'評估爲零。所以,只有'TRUE'由非零表示纔是重要的。 Yay開發'bool'類型! :) – Stephen 2010-06-29 17:27:06
做到這一點,最好的辦法是:
#ifndef FALSE
#define FALSE 0
#elif FALSE != 0
#undef FALSE
#define FALSE REWRITE_PROGRAM("FALSE")
#endif
#ifndef TRUE
#define TRUE 1
#elif TRUE != 1
#undef TRUE
#define TRUE REWRITE_PROGRAM("TRUE")
#endif
哪裏REWRITE_PROGRAM是調用一個函數(提供事先的行號和源文件),採用先進的神經網絡的宏,將智能重寫代碼,以避免TRUE或FALSE的定義發生衝突,其中TRUE定義爲除1之外的任何值,FALSE爲非0之外的任何值。在生成更正後的代碼並生成它之後,它將執行新構建的應用程序版本並退出。
作爲備份,重寫AI還會在REWRITE_PROGRAM
的代碼中添加更多代碼,以確保它的新假設是正確的,只要它遇到假設不正確的情況。
最終,程序會重複自我重複,直到它是正確的,這樣您就不必擔心定義了TRUE和FALSE,衝突以及這些定義是否將在未來發生變化。
但是(!0)== 1 我想你可能會發現這是依賴於實現的。但它沒有多大意義,除非你有一個像你沒有應該 如果(bool_value == TRUE){ ... } 的條件,真的。 – 2010-06-29 16:55:22
!是C中的一個布爾運算符,如果您給它的參數爲0,則返回1,否則返回0。人們有時會想!是一個「交換位」操作符,但事實並非如此。但是你的觀點是很好的。在編寫C時,你可以依靠「false」爲零,但依靠具有任何特定值的「true」是錯誤的,你只能確定它不爲零:) – eemz 2010-06-29 18:22:01