问似乎缺少几个运算符,例如^^, &&=,而->=.
答逻辑异或运算符(假设为“^^'')会很好,但它不可能具有类似下面的短路行为&&和||(参见问题 3.6)。同样,还不清楚短路行为如何应用于假设的赋值运算符&&=和||=。(也不清楚&&=和||=实际需要多少。)
尽管p = p->next是遍历链表的非常常见的惯用法,->不是二元算术运算符。因此,假设的->=运算符实际上并不符合其他赋值运算符的模式。
你可以用几种方法编写一个异或宏
#define XOR(a, b) ((a) && !(b) || !(a) && (b)) /* 1 */ #define XOR(a, b) (!!(a) ^ !!(b)) /* 2 */ #define XOR(a, b) (!!(a) != !!(b)) /* 3 */ #define XOR(a, b) (!(a) ^ !(b)) /* 4 */ #define XOR(a, b) (!(a) != !(b)) /* 5 */ #define XOR(a, b) ((a) ? !(b) : !!(b)) /* 6 */第一种是直接来自定义,但很糟糕,因为它可能多次评估其参数(参见问题 10.1)。第二种和第三种通过两次否定其操作数来将它们“规范化”为严格的 0/1 [脚注] ——第二种然后应用按位异或(到剩余的单个位);第三种则实现异或为!=。第四种和第五种基于布尔代数中的基本恒等式,即
_ _(其中 (+) 是异或,上划线表示否定)。最后,第六种由 Lawrence Kirby 和 Dan Pop 建议,使用?:运算符在两个操作数之间保证一个顺序点,如&&和||。(尽管如此,仍然没有“短路”行为,也不能有。)
a (+) b = a (+) b
附加链接:Dennis Ritchie 关于^^