代码之家  ›  专栏  ›  技术社区  ›  Zifre

为什么C/C++中没有^^运算符?

  •  16
  • Zifre  · 技术社区  · 17 年前

    & 有 && | 有 || . 为什么不呢 ^ ^^ ?

    我知道这不会是短路,但会有不同的语义。在C中, true

    int a=strcmp(str1,str2);// evaluates to 1, which is "true"
    int b=strcmp(str1,str3);// evaluates to 2, which is also "true"
    int c=a ^^ b; // this would be false, since true ^ true = false
    int d=a ^ b; //oops, this is true again, it is 3 (^ is bitwise)
    

    因为你不能总是依赖一个真正的价值观 1 或 -1 ^^

    if(!!a ^ !!b) // looks strange
    
    7 回复  |  直到 16 年前
        1
  •  54
  •   Community Mohan Dere    6 年前

    Dennis Ritchie answers

    没有这样一个国家,既有历史原因,也有现实原因 ^^ 操作人员

    && || 是利用他们的短路评估,不仅是为了效率,而且更经常是为了表达能力和正确性。

    ^^ 操作符总是强制计算表达式的两个臂,因此没有效率增益。此外,在下列情况下:

    if (cond1() ^^ cond2() ^^ cond3() ^^ ...) ...
    

    当一个奇数的 condx() 这是真的。相比之下 && 和 ||

        2
  •  24
  •   Community Mohan Dere    6 年前

    a != b
    

    因为如果操作数的真值不同,这将计算为真。

    Volte 发言人的评论:

    (!a) != (!b)
    

    int

    再次编辑:

    也许我忘记了C++的一些东西,但是我越想这个问题,我就越想知道为什么你会写。 if (1 ^ 2) 首先。目的 ^ 是将两个数互斥或合并(计算结果为另一个数),而不是将它们转换为布尔值并比较它们的真值。

        3
  •  5
  •   Eddie    17 年前

    非- bool 操作数,我猜你想要的是 a ^^ b 评估为:

    (a != 0) ^ (b != 0)
    

    好吧,你有上面的选择,还有其他答案中列出的一些选择。

    接线员 ^^ 这将是多余的 布尔 操作数。仅讨论布尔操作数,为了便于论证,让我们假设 ^ 是按位的,而且 ^^

    • & -按位AND——始终计算两个操作数
    • &&
    • | -按位或--始终计算两个操作数
    • || -逻辑OR—并不总是同时计算两个操作数
    • ^ -按位异或——必须始终计算两个操作数
    • -逻辑异或——必须始终计算两个操作数

    ^^ 把数值转换成 ? 这是个好问题。也许是因为它比 && 和 ,可能是因为您可以轻松构造 ^^

        4
  •  5
  •   Tom Zych    15 年前

    我无法说出Kernighan和Ritchie在发明C时的想法,但您简要提到了“不会短路”,我猜这就是原因:不可能始终如一地实现它。不能像和或那样短路XOR,所以不能完全并行&&和| |。因此,作者们很可能已经决定,做一个类似于其他操作的操作,但并不完全比根本不做更糟糕。

    就我个人而言,我使用&&和| |表示短路,而不是非位。实际上我很少使用按位运算符。

        5
  •  1
  •   David Rodríguez - dribeas    17 年前

    上面发布的解决方案的另一个解决方案(即使它需要代码中的另一个分支)是:

    if ( (a? !b : b ) )
    

        6
  •  1
  •   newacct    17 年前

    在Java中 ^ 运算符在两个布尔操作数上使用时确实执行逻辑异或(就像 & 和 | 在Java中,当应用于布尔值时,分别执行非短路逻辑AND和OR)。与C/C++的主要区别在于C/C++允许你混合整数和布尔值,而java则不。

    bool 值或0或1的整数。然后 ^ 作为逻辑异或很好地工作。

    & 和 布尔 或者0或1。如果允许任何整数值,则这也不起作用。

        7
  •  0
  •   unwind    17 年前

    不管赞成还是反对 ^^ strcmp() 烂透了。它不返回真值(true或false),而是返回输入之间的关系,编码为整数。

    strcmp() 返回。

    您的示例应该从以下内容开始:

    int a = strcmp(str1, str2) == 0; // evaluates to 0, which is "false"
    int b = strcmp(str1, str3) == 0; // evaluates to 0, which is also "false"
    

    必须将返回值与0进行比较,才能将其转换为正确的布尔值,以指示字符串是否相等。

    ^ 接线员的工作也好多了。。。