调试报错:C2082 形参"a"的重定义及C4326 "main"的返回类型应为"int"而非"void"

目录

C2082 形参"a"的重定义

"重定义"错误的分析

为什么是"形参"呢?

形参(形式参数)

实参(实际参数)

C4326 "main"的返回类型应为"int"而非"void"

低效的方式修改

 高效的方式修改


想通过程序实现:用引用的方式将a和b的值互换。

报错程序:

#include <iostream>
using namespace std;

int wap(int &a, int &b)
{
	int c = a;
	int a = b;
	int b = c;
}

void main()
{
	int x = 10;
	int y = 20;
	printf("x:%d and y:%d\n", x, y);
	wap(x, y);
	printf("after replace\n");
	printf("x:%d and y:%d\n", x, y);
}

报错信息:

C2082 形参"a"的重定义

"重定义"错误的分析

经过更改,将wap函数中的类型说明给去除掉,就可以了:

int wap(int &a, int &b)
{
	int c = a;
	a = b;
	b = c;
}

我的理解是,当我把已经定义好的变量"a"和"b"都传入wap函数中时,如果再次以"int a = b;"这样的方式来写,于编译器来说,意味着再次定义a的数据类型,而这是之前就已经定义好的,不能更改了,所以,就出现了所谓的形参"a"重定义的报错。

为什么是"形参"呢?

那么,我又想追问一个问题,为啥说是"形参"呢?恍惚发现自己对这个概念并不是很熟悉,赶紧补起来。翻阅了很多C++的书籍之后,我发现形参和实参的概念,貌似不是C++的,而是属于C的范畴。终于,找到了关于这两个的定义:

形参(形式参数)

在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参

实参(实际参数)

函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参

 

根据定义的描述,可以知道,所谓的形参,就是一个占位符,并没有数据,是用来接受数据的,反过来,等着被接受数据的变量,也就可以理解成这是一个形参了!那么在看本程序中报错的语句段:

int wap(int &a, int &b)
{
	int c = a;
	int a = b;
	int b = c;
}

以"int a = b;"为例进行说明,对于编译器而言,这执行的是两个环节,首先创建一个int类型的变量a,然后,将b的值赋给a。那么,细纠真正的报错地点是发生在第一个环节上,当创建一个int类型的变量a的时候,发现a已经被创建了,而且,这种方式,并不是实参因为a中并没有数据,所以,对于编译器而言,a就是一个形参。

C4326 "main"的返回类型应为"int"而非"void"

低效的方式修改

我对这个这是一个警告信息是这样理解的,因为wap函数的返回值是设置的int类型,而且,我没有在主函数中用具体的变量来接受wap函数的返回值,那么这个返回值肯定会返回到主函数中去,但是,程序并没有提示,说函数的返回值没有东西来接收,那肯定是主函数用某种方式(虽然我目前也不知道到底是那种方式,但肯定是非正常的方式吧)已经把wap函数要返回的东西给接住了!

那么当主函数运行完毕后,虽然设置的主函的返回类型是void,但是没办法析构或者说是处理掉wap函数返回的数据,所以,就出现了这样一个警告,提示程序员,将主函的返回值也应该定义为一个int类型的变量,从而将从wap函数中接的东西也给返回出去,但至于这个东西具体是啥,我目前就真想不到了— —||。

而且,我觉得因为wap函数虽然设置的是一个int返回类型,但并没有实际返回任何数值(因为我当时忘写return了!)。所占据的内存肯定很小,所以,才是警告,而非报错。

根据以上的想法,再进行修改,就在主函中用原先的俩变量,来接wap函数的返回值,就不报错了:

int wap(int &a, int &b)
{
	int c = a;
	a = b;
	b = c;
	return a, b;
}

void main()
{
	int x = 10;
	int y = 20;
	printf("x:%d and y:%d\n", x, y);
	x,y = wap(x, y);
	printf("after replace\n");
	printf("x:%d and y:%d\n", x, y);
}

运行如下:

 高效的方式修改

上面的方式是在主函中将函数返回值给接收了,但是,这种做法做的很低效,为什么这么讲呢,因为上面这种做法忽略了引用的作用。

引用的本质是一段连续内存空间的别名,就是我通过引用去修改的值,它不会随着函数的运行结束而被析构掉,就比如以这个程序为例,a,b分别是x,y的引用,x,y是在主函中定义的,a,b是在被调函数中定义的,那么我在被调函数中通过引用(a,b)去修改的时候,其实,也是在修改x,y所指向的同样的内存空间中的数据,那么,当我被调函数结束的时候,我完全可以不返回任何的值,就直接让被调函数把两个引用给析构掉了,也不会影响引用所已经完成交换数据的结果,因为其结果还可以通过x,y被调用。a,b就是x,y的别名,a,b没了,x,y还存在,一样不影响之前的操作,所以,高效的修改方式是:

void wap(int &a, int &b)
{
	int c = a;
	a = b;
	b = c;
}

void main()
{
	int x = 10;
	int y = 20;
	printf("x:%d and y:%d\n", x, y);
	wap(x, y);
	printf("after replace\n");
	printf("x:%d and y:%d\n", x, y);
}

如其所看,把wap的返回值设置为"void",什么都不去返回。然后,在主函中直接运行wap函数就行了,也什么都不用接,这样不仅完成了所要实现的任务,而且还高效!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值