gpt4 book ai didi

c++ - 结构和函数返回值

转载 作者:太空宇宙 更新时间:2023-11-04 13:13:53 25 4
gpt4 key购买 nike

我刚开始研究 STRUCTURES,玩了一会儿就被烧毁了!

这是第一个展览:

#include <iostream>
using namespace std;

struct structure1{
int h;
int m;
int s;
} structVar;
int func(structure1 x);

int main(){
structure1 x;
structVar.h=4;
structVar.m=6;
structVar.s=7;

func(structVar);
cout<<x.h<<x.m<<x.s<<endl;

}

int func(structure1 x){

--x.h;
--x.m;
--x.s;

};

它的输出是:

1072276636-21953788778

但我希望:

356 

所以我尝试了这种方式,展览 2:

#include <iostream>
using namespace std;

struct structure1{
int h;
int m;
int s;
} structVar;

struct returnstruct{
int val1;
int val2;
int val3;
}returnvalue;
int func(structure1 x);

int main(){

structVar.h=4;
structVar.m=6;
structVar.s=7;

func(structVar);
cout<<returnvalue.val1<<returnvalue.val2<<returnvalue.val3<<endl;

}

int func(structure1 x){

returnvalue.val1=--x.h;
returnvalue.val2=--x.m;
returnvalue.val3=--x.s;


};

并得到我需要的输出:

356

问题是我无法解释原因

最佳答案

这种混淆主要是由于变量作用域。

要点:

  • 函数参数名称,例如x,是函数的局部名称。如果名称与全局范围的变量存在冲突,则局部函数参数优先。
  • 结构通过按值传递,这意味着创建一个拷贝并将其作为参数传递给函数。

情况 1,您有一个名为 structure1 的结构的结构定义。在这个全局范围内,您还有一个它的实例,称为 structVar。然后在 main 函数的范围内,您定义了一个类型为 structure1local 变量,名为 x。以下几行

  structVar.h=4;
structVar.m=6;
structVar.s=7;

正在修改 global 范围变量,structvar。然后你打电话

func(structVar);

此行修改了 global 变量的拷贝 structVar,将其作为函数参数传递给 funcfunc 使用名称 x 作为对 structure1 的引用,但请记住,由于结构是按值传递的,因此该名称是指一个在括号之间传递给它的任何结构的拷贝 - func(structVar)。此参数名称 xmain 中定义的其他 x 没有任何关系。它特定于或作用于函数体 func

您可以稍微探索一下,将函数参数的名称更改为 y,然后首先注意到它不会编译,提示 x 未定义。这意味着在该函数的主体内,它不知道您在 main 中定义的 x 因为 that x 是局部的,也就是仅限于 main。将此与 structVar 进行对比,它是在任何函数的参数列表或主体之外定义的。 structVar 可以在任一函数中引用,因为它的作用域是全局的。

cout<<x.h<<x.m<<x.s<<endl;

使用对作用域的这种理解,可以看出这一行是在 main 中定义的 x 上操作,它还没有其成员 (h,m,s)初始化或分配任何值,因此是“奇怪”的输出。

现在,让我们看看您发布的第二个代码块。

在这里,您添加了另一个全局范围结构,称为 returnvalue。现在,您有两个全局范围变量,structVarreturnvalue。由于该范围,structVarmain 内部可见,您可以在其中修改其成员值 (h,m,s)。

接下来,您将该全局变量作为参数 x 传递给 func。请记住,这是复制 structVarfunc 调用 x。因此,x 具有 structVar 的 h、m 和 s 的值。

func 内部,由于全局作用域,它可以看到 returnValue。使用 structVar 的拷贝,现在又称为 x,您将 returnvalue 的值设置为(预)递减 (--) 值参数 x。由于 xstructVar 的拷贝,并且 structVar 的成员设置为数字 h=4、m=6、s=7、returnvalue 然后接收到 h=3, m=5, s=6。 func 然后返回到 main

现在,回到 main,因为 returnvalue 是全局范围的,main 可以看到它并使用 cout 打印出它的值,因此 356

的输出

关于c++ - 结构和函数返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38416325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com