我爱软件开发 发表于 2016-4-16 15:28:33

C++程序奇怪的地方

       定义一个预处理命令作为函数的名字,然后分别改变它的名字。经过不断的改变,发现函数名的改变还会改变它的结果,跪求各高手解答。
       我用的是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
求解释

muyu0096 发表于 2016-4-16 15:52:27

这有什么好解释的,首先你打字都打错了,根据你的上下文意思,“把3个swap都改为其他的名字”应该是3个"TT",自己打字不仔细,平白增加帮你的人的干扰。
其次,你那个程序,根本没有用到宏定义。你百度下宏定义的格式再看吧

我爱软件开发 发表于 2016-4-16 16:01:21

预处理,不是宏定义。我想知道为什么把swap改为TT结果会不一样。我是新人,不懂。可能对你来说根本不是上面问题,但是我根本想不明白为什么。还有打错字了吗,程序运行很正常啊!

muyu0096 发表于 2016-4-16 20:27:29

你的这个预处理命令就是一个宏定义,本身没有什么冲突的,就好比你父亲是你的父亲同时也是你妈妈的丈夫一样。
我知道你是新人,但你遇见问题首先要自己试着解决啊,你自己想想你百度了define的用法没有?
#define TT swap就是在程序中把所有的TT换成swap,只是简单的文本替换。如果你不用这个命令,那么实际上函数名就是TT,你调用的也是TT,你的程序显示的应该是交换了的数值,你说没交换,我不知道你程序哪里有问题。
如果有这个预处理命令,那么也简单进行文本替换。结果依旧是交换数值。
你这里这个预处理命令用的完全是没有任何意义的,当然也不为错。
换句话说,就你贴出来的程序而言,不改动程序主体本身的前提下,#define TT swap命令里的TT和swap你随便改,同时改或者不同时改,结果都一样,都是交换数据。

WZLQ 发表于 2016-4-17 00:16:55

通俗点讲。。。你int main里输入的 TT(i,j),系统就自然会去找TT这个名字里的内容 然后&这个符号是取地址 符号知道吧。。。而&a和&b 自然就成为了 你代入过来的 I和J 的别名了。然后你改a就是改I ,懂了吧。

WZLQ 发表于 2016-4-17 00:22:04

如果没有取 地址符的 话,他们 就是两个变量,哪怕名字一样,他们也是不同区域的2个变量。

WZLQ 发表于 2016-4-17 01:14:28

还有 你提问 根本没给别人 至少我带来任何麻烦,我反而很高兴 回答,温故而知新嘛。。

xls6688 发表于 2016-4-17 01:51:44

看看{:5_92:}

muyu0096 发表于 2016-4-17 18:24:58

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

然而你温故温的错了。。。
&用在参数列表里是 表示引用,不是区地址运算符。
引用是类型名,取地址运算符是一元运算符。

WZLQ 发表于 2016-4-17 21:31:05

int a = 0; int *j = &a; 这样的话就是取a的地址给 指针j.
int a = 0; int &j=a; 这样的话就是引用,J就是a的别的名字或者替身

WZLQ 发表于 2016-4-17 22:58:29

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

他是取 地址,,取了I和J的地址。。。算了,我懒的争。。。

muyu0096 发表于 2016-4-18 18:06:02

WZLQ 发表于 2016-4-17 22:58
他是取 地址,,取了I和J的地址。。。算了,我懒的争。。。

你上面说的没错啊,但楼主的显然是函数原型用作参数列表啊,这不是引用类型做参数是什么?何况你再看带人的实参是什么就知道了么,是变量,而非变量地址。
不必懒得争,学习这东西,就是要争个明白,
页: [1]
查看完整版本: C++程序奇怪的地方