取地址-关于swap()的小白提问!

问题描述

关于swap()的小白提问!

#define Swap(x,y) {x=x+y;y=x-y;x=x-y;}
这样子时,如果x和y的地址相等,比如Swap(x,x),最后x的值变成了0,这算为什么呢?
如果取地址void swap(int *x,int *y); 那就没有影响了

解决方案

道理很简单,你这个不是函数,而是一个宏,代码中会用你后面的去替换。
所以会作用到调用swap的地方。

解决方案二:

宏函数就是一个替换:

  Swap(x,x)被替换为 {x=x+x;x=x-x;x=x-x;}
    所以x就是0了。

解决方案三:

这是我的代码:
#if 1
#include
#define Swap(x,y) {x=x+y;y=x-y;x=x-y;}
using namespace std;

int main()
{
int x = 3, y = 9;
Swap(x, x);
cout << x << y << endl;
return 0;
}
#endif
我解释一下为什么:#define Swap(x,y) {x=x+y;y=x-y;x=x-y;} 这一条语句在程序预处理的时候将Swap(x, y) 替换为x=x+y;y=x-y;x=x-y;这三条语句
具体已经当你调用Swap(x, x);的时候,相当于x=x+x;x=x-x;x=x-x;最后面的一条语句决定了x一定是0.

解决方案四:

首先赞美一下楼主的思路,这种交换数值的方法比较新颖。可我要说的是:就算是正常使用您这个方法,但x和y的值比较大怎么办?比如,x和y都大于int最大值的一半。。。。

解决方案五:

#define的都是简单的宏替换,在预编译就会完成替换

时间: 2024-10-29 04:53:23

取地址-关于swap()的小白提问!的相关文章

python中a,b=b,a+b怎么理解?是怎么运行的呢?小白提问

问题描述 python中a,b=b,a+b怎么理解?是怎么运行的呢?小白提问 最近学习python,遇到如题疑问,哪位大侠帮帮解惑一下!万分感谢 解决方案 应该是元组操作 (a,b)是一个元组,让它等于(b,a+b)这个元组的值. 举例: a=3, b=5 执行完就是a=5, b=8 解决方案二: 直接按逗号来分别取 a = b b = a + b 解决方案三: 注意 (a,b)=(b,a) 相当于交换ab 但是 a=b b=a 则ab都变成了b

c语言-c中关于引用传递的举例还是没看懂怎么理解,形参中的&amp;amp;amp;还能按取地址符号来用吗

问题描述 c中关于引用传递的举例还是没看懂怎么理解,形参中的&还能按取地址符号来用吗 解决方案 当作取地址的时候,&是一个一元运算符,和! ~ * -等类似.作为按引用传递的时候,&不是运算符,是修饰符. 函数定义中不能出现运算符. 不信你试试 int foo(int -a) int foo(int !a) 都是不能编译的. 解决方案二: 引用是引用,取地址是取地址.不同上下文,一个符号有不同的用途,不要瞎联系. 解决方案三: &还可以是按位and运算符呢.*还可以是乘法运

小白提问: ifream访问阿里云服务器的页面不是直接加载,而是下载

问题描述 小白提问: ifream访问阿里云服务器的页面不是直接加载,而是下载 我在ifream属性src写入文件的地址,我想让页面直接显示在ifream中,不想下载,怎么解决?急急急!!! 解决方案 浏览器直接能打开那个页面吗?还是弹出保存对话框?

ASP小偷偷取地址并生成html

ASP小偷偷取地址并生成html <% function getHTTPPage(url)   dim Http   set Http=server.createobject("MSXML2.XMLHTTP")   Http.open "GET",url,false   Http.send()   if Http.readystate<>4 then        exit function   end if   getHTTPPage=bytes

数组首地址取地址

一.问题来由 普通指针可被修改导致地址偏移: #include <iostream> using namespace std; int main(int argc,char *argv[]) { int a = 6; int *p = &a; //p存放一个地址,pp存放p的地址,上面的代码可以让p存放的地址偏移 cout<<&a<<endl; int *pp = (int *)&p; cout<<p<<endl; (*p

c++用(void *)和直接用*对数组名取地址有什么区别

问题描述 c++用(void *)和直接用*对数组名取地址有什么区别 char ch[5]="asdf"; cout<<(void * )ch; cout<<* ch; 编译输出是一样的 有什么区别? 解决方案 就你这个例子来说,没有什么区别.但是对于结构体等复杂类型,区别就大了,void *得到的指针,如果你对它相加,可能和你用struct的指针相加得到的地址完全不同. 指针的类型决定了一个数据单位的大小. 解决方案二: C++拾遗之对数组名取地址对数组名取地

c语言-C语言小白提问```求大神

问题描述 C语言小白提问```求大神 float search(float (*p)[4]){ float *pt = NULL; for (int i = 0; i < 4; i++) { if ((*p + i) < 60) { pt = *p; } } return pt; } int main(int argc, const char * argv[]) { float score[][4] = {{60,70,80,90},{56,86,97,68},{57,58,98,95}};

c++-请教一个变量取地址的问题

问题描述 请教一个变量取地址的问题 CBitmap qwe; qwe.LoadBitmapW(IDB_BITMAP1); yy[1].brush.CreatePatternBrush(&qwe); 请问下这段代码中,如果最后面不加&的话编译就通不过,提示不能从CBTMAP转成 CBTMAP*我的理解是,指针都是按地址操作的,而这个是一个值,必须要取其地址才能跟 指针通用,请问这么理解对么 解决方案 指针的问题,,,内存的问题.编译报错报的是类型的错误.其实指针本质上也是在内存里定义一块地方

css小白提问 问什么div的父样式无法显示?

问题描述 css小白提问 问什么div的父样式无法显示? <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-cn" lang=&q