-1

我想输入一个按位计算并交换两个变量的宏

我没有在我的程序中一次又一次地键入该代码,而是决定使用宏作为

#define swapVars(p,a,b) {p=a^b;a=^p;b=^p;}

当我在代码中使用宏时

int a = 10, b=19;
int swap_dummy = 0; //May contain anything
swapVars(swap_dummy, a, b);
printf("a = %d   | b = %d", a, b);

我在更换时遇到错误。宏定义错了吗?(顺便说一句,应该是)。这种情况下正确的宏是什么?

4

2 回答 2

3

=^你想要的^=不是有效的。虽然尚不清楚为什么在正常分配可以正常工作时使用按位异或。

但真的看到你的问题的评论,为什么这根本不应该是一个宏。

于 2013-02-17T05:13:06.780 回答
2

这个问题很像“我如何以错误的方式解决我的问题?”。

您的宏似乎是异或交换的错误实现。我不会帮助您修复异或交换,而是尝试帮助您以正确的方式解决问题:虽然异或交换是一个有趣的概念,但它没有实际用途。您确定这不是过早的优化吗?

  1. 与临时变量交换不同,这不是惯用的。首先,如果你写了一个临时变量 swap,你就不会遇到这个问题。此外,如果您必须花时间向您的同事解释您的代码,那么您可能希望考虑对您的工作场所进行更重要的优化。
  2. 在这种情况下,它的定义不如典型的交换。对值使用异int或会导致陷阱表示,例如负零。使用陷阱表示是未定义的行为。未定义的行为可能会导致您的程序以非常奇怪的方式出现故障。
  3. 编译器在编译更常见和定义明确的代码方面做得更好。让您的编译器为您进行过早的优化。

关于inline关键字:过早停止优化。使用简单易读的代码让您的程序正常运行,以便您可以寻求我们的帮助。一旦你有了一个可行的解决方案,如有必要,分析它以找出最重要的优化可能来自哪里。

于 2013-02-17T05:18:54.917 回答