C/C++ 中的逻辑否定和赋值运算符?

Logical negation and assignment operator in C/C++?

本文关键字:赋值运算符 C++      更新时间:2023-10-16

有没有更简洁的方法来编写此函数的第二行而不重复冗余a

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

有没有更简洁的方法在不重复冗余的情况下编写此函数的第二行?

!是一元运算符,如果这是您所期望的,则无法将其与=相关联。

但是你可以做一些类似的事情a ^= true;,这不是更简洁的方式,但这不会重复冗余。无论如何,这不是一个与a = !a;相反的好方法,后者更具可读性

好吧,我真的没有看到这样做的价值,但您可以使用 xor 或简单的递减。这两种方法都有效。

a ^= 1;
a--;

那么你就不必重复a.

但是,如果您希望它非常清晰,请考虑使用一个函数:

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)))

但即使这样,我也不愿使用。

老实说,这并不是一个值得解决的问题。 :)

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

一元运算符!实际上足够简洁,任何其他技巧都会导致代码不可读。

任何其他快捷方式形式,例如二进制运算符,如+*

a += 5;
b *= 7;

保持对运算符的原始含义的引用:分别乘法和加法。

在你的句子中:

无需重复冗余a

有一个错误的假设,即a是多余的,以防编译器被指示在不重复变量名称的情况下否定a。不:它告诉阅读代码的人(甚至你自己,例如一年后!(要否定的变量是a。由于 C 语法没有为逻辑否定运算符定义任何句法糖,因此a根本不是多余的。