鱼C论坛

 找回密码
 立即注册
查看: 1981|回复: 11

C++程序奇怪的地方

[复制链接]
发表于 2016-4-16 15:28:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
       定义一个预处理命令作为函数的名字,然后分别改变它的名字。经过不断的改变,发现函数名的改变还会改变它的结果,跪求各高手解答。
       我用的是VC6.0的编译器。代码如下:
//***************************************************************
//***************************************************************
#include<iostream>
#define TT swap
using namespace std;
int main()

{
void TT(int &,int &);
int i=3,j=5;
TT(i,j);
cout<<i<<" "<<j<<endl;
return 0;
}

void TT(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
//**************************************************
//**************************************************

代码上面的结果是:3   5
可是当预处理命令的改为其他的名字时  
代码上面的结果是:5   3
如何解释??????????

补充:
当然,不用预处理命令,直接用函数名swap运行后:
代码上面的结果是:3   5
把3个swap都改为其他的名字
代码上面的结果是:5   3
求解释
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-16 15:52:27 | 显示全部楼层
这有什么好解释的,首先你打字都打错了,根据你的上下文意思,“把3个swap都改为其他的名字”应该是3个"TT",自己打字不仔细,平白增加帮你的人的干扰。
其次,你那个程序,根本没有用到宏定义。你百度下宏定义的格式再看吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-16 16:01:21 | 显示全部楼层
预处理,不是宏定义。我想知道为什么把swap改为TT结果会不一样。我是新人,不懂。可能对你来说根本不是上面问题,但是我根本想不明白为什么。还有打错字了吗,程序运行很正常啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-16 20:27:29 | 显示全部楼层
你的这个预处理命令就是一个宏定义,本身没有什么冲突的,就好比你父亲是你的父亲同时也是你妈妈的丈夫一样。
我知道你是新人,但你遇见问题首先要自己试着解决啊,你自己想想你百度了define的用法没有?
#define TT swap就是在程序中把所有的TT换成swap,只是简单的文本替换。如果你不用这个命令,那么实际上函数名就是TT,你调用的也是TT,你的程序显示的应该是交换了的数值,你说没交换,我不知道你程序哪里有问题。
如果有这个预处理命令,那么也简单进行文本替换。结果依旧是交换数值。
你这里这个预处理命令用的完全是没有任何意义的,当然也不为错。
换句话说,就你贴出来的程序而言,不改动程序主体本身的前提下,#define TT swap命令里的TT和swap你随便改,同时改或者不同时改,结果都一样,都是交换数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-17 00:16:55 | 显示全部楼层
通俗点讲。。。你int main里输入的 TT(i,j),系统就自然会去找TT这个名字里的内容 然后&这个符号是取地址 符号知道吧。。。而&a和&b 自然就成为了 你代入过来的 I和J 的别名了。然后你改a就是改I ,懂了吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-17 00:22:04 | 显示全部楼层
如果没有取 地址符的 话,他们 就是两个变量,哪怕名字一样,他们也是不同区域的2个变量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-17 01:14:28 | 显示全部楼层
还有 你提问 根本没给别人 至少我带来任何麻烦,我反而很高兴 回答,温故而知新嘛。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-17 01:51:44 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-17 18:24:58 | 显示全部楼层
WZLQ 发表于 2016-4-17 00:16
通俗点讲。。。你int main里输入的 TT(i,j),系统就自然会去找TT这个名字里的内容 然后&这个符号是取地址  ...

然而你温故温的错了。。。
&用在参数列表里是 表示引用,不是区地址运算符。
引用是类型名,取地址运算符是一元运算符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-17 21:31:05 | 显示全部楼层
int a = 0; int *j = &a; 这样的话就是取a的地址给 指针j.
int a = 0; int &j=a; 这样的话就是引用,J就是a的别的名字或者替身
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-17 22:58:29 | 显示全部楼层
muyu0096 发表于 2016-4-17 18:24
然而你温故温的错了。。。
&用在参数列表里是 表示引用,不是区地址运算符。
引用是类型名,取地址运算 ...

他是取 地址,,取了I和J的地址。。。算了,我懒的争。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-18 18:06:02 | 显示全部楼层
WZLQ 发表于 2016-4-17 22:58
他是取 地址,,取了I和J的地址。。。算了,我懒的争。。。

你上面说的没错啊,但楼主的显然是函数原型用作参数列表啊,这不是引用类型做参数是什么?何况你再看带人的实参是什么就知道了么,是变量,而非变量地址。
不必懒得争,学习这东西,就是要争个明白,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 00:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表