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

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

有没有更简洁的方法来写这个函数的第二行而不是重复a冗余?

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

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

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

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

a += 5;
b *= 7;

保留对运算符本义的引用:分别为乘法和加法。

在你的句子中:

without repeating a reduntantly

错误的假设是 a 是多余的,以防编译器可以被指示否定 a 而不重复变量名。不:它告诉阅读代码的人(甚至是你自己,例如一年后!)要取反的变量是 a。而且由于 C 语法没有为逻辑否定运算符定义任何语法糖,所以 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)))

但即使是这个我也犹豫要不要用。

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

Is there a more concise way to write the second line of this function without repeating a reduntantly?

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

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