繁体   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