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

How to swap two numbers in preprocessor?

本文关键字:两个 数字 交换 预处理 处理器      更新时间:2023-10-16

我尝试制作应该交换参数值的 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++新手,谁能告诉我为什么我不能把它变成那样?

你不能这样做,因为当宏展开时,"参数"会按原样替换。因此,展开后的宏将如下所示

2 = 2 * 4;
4 = 2 / 4;
2 = 2 / 4;

换句话说,您尝试将值分配给值,这毫无意义。

一种解决方案是改用变量,但我建议的是避免首先使用预处理器宏,而是创建一个"正确"执行此操作的inline函数。或者,你知道,只是使用std::swap.

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

std::swap做你想做的事。

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

#define swap(x, y) std::swap(x, y)

如果要避免使用 std::swap ,也可以将元组(x, y)分配给(y, x)

#define swap(x, y) std::tie(y, x) = std::make_tuple(x, y)

我不确定问题是什么,但你应该考虑到计算机通常不能处理正确的数学概念,而是受到更多限制。当你使用int时,它不是一个整数,而是一个在某个限制范围内保存值的变量(int通常是32位的,有符号的,二进制的补码,保持值-231到231-1)。

虽然在数学术语中您所做的转换是有意义的,但有许多ab的组合,表达式a*b将超出int表示的范围。 该行为在C++语言中未定义,但假设您直接访问硬件,在当前处理器中,它将环绕并生成有效范围内的数字,但该数字不保存数学值a*b 。其余操作将从错误的值开始并产生错误的结果。