"type&"是什么类型?为什么此类型函数语法一错,编译器就会出现各类奇怪结果?
  • 板块学术版
  • 楼主Herman526
  • 当前回复51
  • 已保存回复51
  • 发布时间2023/1/25 13:47
  • 上次更新2023/10/24 03:07:50
查看原帖
"type&"是什么类型?为什么此类型函数语法一错,编译器就会出现各类奇怪结果?
786834
Herman526楼主2023/1/25 13:47

近期,我认识了 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](未使用的参数) 警告,程序却输出了正确结果:bb 的值。

难道用 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> 没有初始化;程序输出则是错得一塌糊涂,不管 bb 取何值,它净是输出 00。更令我出乎意料的是,如果将这两段代码拿到评测机评测,则又别是一番截然不同结果了——程序被判了 RE

目前,我大致能明白在洛谷评测机上程序运行错误,是由于评测环境的不同。不过,在 Dev-C++ 中,这些现象的发生缘由却仍是个未解之谜:

  1. 第一段代码的编译信息中出现了一行 At global scope: (一般情况下,编译器出现 [-Wunused-parameter] 警告时不会有此信息);
  2. 第二段代码编译时发出有关 <anonymous> 的警告(根据词典,"anonymous" 是“匿名的”之意,但放在这里我就未解其意了);
  3. 对于两段代码,编译器均会发出 [-Wreturn-local-addr] 警告;
  4. 只有第二段代码输出错误。

大家明白 type& 究竟是什么类型(引用或地址值),以及上述事件是如何发生的吗?

2023/1/25 13:47
加载中...