C++ 如何在预处理器中交换两个数字?

C++ 如何在预处理器中交换两个数字?,c++,C++,我尝试制作makro,它应该交换参数中的值。我的代码: #include <iostream> using namespace std; #define swap(x,y) \ x = x * y; \ y = x / y; \ x = x / y; int main() { int a = 1; int b = 2; swap(a,b); cout &

我尝试制作makro,它应该交换参数中的值。我的代码:

#include <iostream>

using namespace std;

#define swap(x,y)     \
x = x * y;              \
y = x / y;              \
x = x / y;              

int main() {

    int a = 1;
    int b = 2;

    swap(a,b);

    cout << "a: " << a << ", b: " << b << endl; // a = 2 and b = 1

    system("pause");
    return 0;
}

<我是C++的新手,有人能告诉我为什么我不能这样做吗?< /p> 你不能这么做,因为当宏被扩展时,参数被替换为IS。因此,在展开宏时,宏将如下所示

2 = 2 * 4;
4 = 2 / 4;
2 = 2 / 4;
换句话说,您试图将值赋给一个值,这毫无意义

一种解决方案是改用变量,但我推荐的一种方法是首先避免使用预处理器宏,而是创建一个内联函数来正确执行此操作。或者,你知道,只是使用

还有一件事:你们说你们想在预处理器中交换两个数字。那是不可能的。预处理器不做任何事情,它只是用宏体替换宏调用,以创建编译器看到的代码并编译成可执行代码,因此您所做的计算无论如何都是在运行时完成的。如果您想在编译时执行某些操作,而不是由预处理器执行,那么您应该查看模板和constepr。

std::swap做您想做的事情

如果您的任务真的是为此编写宏,请编写一个使用该函数的宏。但是要准备好,你的老师可能不喜欢这个解决方案

#define swap(x, y) std::swap(x, y)
如果要避免使用std::swap,还可以将元组x,y指定给y,x:


我不确定这个问题是什么,但是你应该考虑到,一般来说,计算机不能用正确的数学概念来工作,但更受限制。当您使用int时,它不是一个整数,而是一个包含某个受限范围内的值的变量,int通常是32位、有符号、2的补码,包含值-231到231-1


虽然在数学术语中,你所做的转换是有意义的,但是A和B的组合有很多,表达式A*B将从int表示的范围内掉出来。C++中的行为是不确定的,但是假设你直接访问了硬件,在当前的处理器中,它将环绕并产生一个有效范围内的数字,但这个数字不包含数学值a*b。其余的操作将从错误的值开始并产生错误的结果。

为什么是宏?为什么不简单的std::swap?swap2,4应该产生什么结果?这些都不是变量,所以根本无法交换。是否要更改代码其余部分中2和4的含义?此宏非常容易出错。有很多情况下它将无法编译。@Cleo您希望swap2,4的结果是什么;事实上现在4是新的2,反之亦然?你应该和一些有经验的数学家彻底讨论这个问题。对于数字类型,你可以看看。然而,使用C++中的宏是一个可怕的想法,因为它非常容易出错。@ Ceo函数如何?好的,但是我必须在宏中完成这个任务,我不能使用第三值。这可能吗?@Cleo如果你必须使用一个宏,它可以扩展为代码来交换值,我想这只是使用学校作业的实际值?然后你需要想出另一种不赋值的方法。好的,谢谢,但是。。是整数的,是的。这适用于没有等级的每种变量吗?它适用于可以重新分配新值的每种类型。所以,是的,几乎所有的事情都是如此。@Cleo所以问题仍然是,为什么你需要把它包装成一个宏?@πάνταῥεῖ 我猜这是一个C老师教C++的练习,经常这样。如果我在这样的课堂上,我会把答案中的第一个答案交给老师,也许会加上一条关于宏的评论;是 啊交换是可以的,但我是在。。这是我的第二个C++课程,你认为它应该是答案吗?对于那个级别的课程来说不是很难吗?
#define swap(x, y) std::tie(y, x) = std::make_tuple(x, y)