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;
相反的好方法,后者更具可读性
有没有更简洁的方法来写这个函数的第二行而不是重复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;
相反的好方法,后者更具可读性