簡體   English   中英

C/C++ 中的邏輯否定和賦值運算符?

[英]Logical negation and assignment operator in C/C++?

有沒有更簡潔的方法來寫a function 的第二行而不重復冗余?

void myfunc()
{
    bool a = false; // Assume that this won't alway be hardcoded to false.
    a = !a;
}

好吧,我真的看不出這樣做的價值,但你可以使用異或或簡單的遞減。 這兩個都有效。

a ^= 1;
a--;

然后你就不必重復a

但如果你想讓它非常清楚,可以考慮使用 function:

void flip(bool *b) 
{
    (*b)--;
}

bool b = true;
flip(&b);

C++,可以參考

void flip(bool &b) 
{
    b--;
}

bool b = true;
flip(b);

或者寫一個宏。 實際上,宏對於解決重復問題非常方便。 雖然,我幾乎從不為此使用它們,因為它根本不值得付出努力。 我寫了一個宏來避免重復調用 malloc。 這樣的調用通常如下所示:

int *x = malloc(12 * sizeof *x);

您可以避免重復:

#define ALLOC(p, n)  \
            ((p) = malloc((n) * sizeof *(p)))

但即使是這樣,我也猶豫要不要使用。

老實說,這真的不是一個值得解決的問題。 :)

有沒有更簡潔的方法來寫這個 function 的第二行而不重復冗余?

! 是一元運算符,如果這是您所期望的,則不能將它與=相關聯。

但是你可以做類似a ^= true;事情。 ,這不是一個更簡潔的方式,但這是沒有多余的重復 無論如何,這不是與a =;a;相反的好方法。 這更具可讀性

唯一可能的答案是:不幸的是不是

一元運算符! 實際上已經足夠簡潔了,任何其他技巧都會導致代碼不可讀。

任何其他快捷形式,例如+*等二元運算符:

a += 5;
b *= 7;

保持對運算符本義的引用:分別為乘法和加法。

在你的句子中:

無需a

錯誤的假設是a是多余的,以防編譯器可以被指示否定a而不重復變量名。 不:它告訴閱讀代碼的人(甚至是你自己,例如一年后!)要取反的變量是a . 並且由於 C 語法沒有為邏輯否定運算符定義任何語法糖, a根本不是多余的。

暫無
暫無

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

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