近期,我认识了 type& 这个新数据类型(type 为不带 & 的某种数据类型),可是我竟然还不知道它是什么——网上说这叫“引用”,可 C++ 书上却说它是“地址值”。即便如此,这时,我还是突发奇想,想用这种类型编这样一个程序:
#include<cstdio>
int&a(int b,int c){return b;}
int main(){int b=1,c=a(b,0);printf("%d",c);}
然而,事情没有我想象的那么简单。当这段代码用开了 -Wall 和 -Wextra 的 Dev-C++ 编译器编译时,它发出了在我的编程学习中前所未有的 [-Wreturn-local-addr](返回将要销毁的变量地址) 与 global scope 上的 [-Wunused-parameter](未使用的参数) 警告,程序却输出了正确结果:b 的值。
难道用 int& 型函数编程就这样举步维艰吗?我意犹未尽,又为该代码做了微调:
#include<cstdio>
const int&a(int&b,int&c){return b+c;}
int main(){int b=1,c=a(b,b);printf("%d",c);}
这次,编译器的 [-Wunused-parameter] 警告应当不复存在了吧!不过,编译器除了给出 [-Wreturn-local-addr] 警告,竟还提示了我 <anonymous> 没有初始化;程序输出则是错得一塌糊涂,不管 b 取何值,它净是输出 0。更令我出乎意料的是,如果将这两段代码拿到评测机评测,则又别是一番截然不同结果了——程序被判了 RE!
目前,我大致能明白在洛谷评测机上程序运行错误,是由于评测环境的不同。不过,在 Dev-C++ 中,这些现象的发生缘由却仍是个未解之谜:
At global scope: (一般情况下,编译器出现 [-Wunused-parameter] 警告时不会有此信息);<anonymous> 的警告(根据词典,"anonymous" 是“匿名的”之意,但放在这里我就未解其意了);[-Wreturn-local-addr] 警告;大家明白 type& 究竟是什么类型(引用或地址值),以及上述事件是如何发生的吗?