prev up next   top/contents search

comp.lang.c FAQ 列表· 第 20.21 题

似乎缺少几个运算符,例如^^, &&=,而->=.


逻辑异或运算符(假设为“^^'')会很好,但它不可能具有类似下面的短路行为&&||(参见问题 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 [脚注] ——第二种然后应用按位异或(到剩余的单个位);第三种则实现异或为!=。第四种和第五种基于布尔代数中的基本恒等式,即
        _   _
a (+) b = a (+) b
(其中 (+) 是异或,上划线表示否定)。最后,第六种由 Lawrence Kirby 和 Dan Pop 建议,使用?:运算符在两个操作数之间保证一个顺序点,如&&||。(尽管如此,仍然没有“短路”行为,也不能有。)

附加链接:Dennis Ritchie 关于^^


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管