如何在预处理器中交换两个数字
How to swap two numbers in preprocessor?
我尝试制作应该交换参数值的 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)。
虽然在数学术语中您所做的转换是有意义的,但有许多a
和b
的组合,表达式a*b
将超出int
表示的范围。 该行为在C++语言中未定义,但假设您直接访问硬件,在当前处理器中,它将环绕并生成有效范围内的数字,但该数字不保存数学值a*b
。其余操作将从错误的值开始并产生错误的结果。
- C++通过数字比较两个数字
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 在 txt 文件中显示前两个数字的程序
- 形成一个斐波那契三角形,使得每个数字是上面左对角线或右对角线上两个数字的总和
- 两个数字的对称配对功能
- 查找中间两个数字的正则表达式的匹配项
- 使用C++具有两个数字的最短路径算法.(C++)
- 将两个数字添加为链表
- C++ 分段错误:11 错误,同时编码将两个数字相加的链接列表
- 我应该如何使用remove_if删除两个数字范围内的元素
- 是否有任何内置函数可以检查给定的两个数字在给定整数数组中的顺序是否相同?
- 子数组中两个数字的相同出现(连续)
- 如何使用位操作在单个整数中编码和解码两个数字
- 在 c++ 程序中调试链表以添加两个数字: 有人可以解释为什么 l3=l3->next;导致错误?
- 钻头以两个数字替换位
- C 如何在小数系统中添加两个数字
- 为什么我的代码不给最后两个数字
- 如何在给出前两个数字的级数中找到大于 x 的第 n 个最小子数组总和?
- 输入两个数字后程序关闭
- 代码是否交换数组的两个数字