我刚刚开始使用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
问题是我无法解释原因
答案 0 :(得分:0)
structure1 x
的值按值传递。这意味着func
函数获取调用者从未看到的参数的副本。因此func
在此上下文中无效,除非它返回一些内容。
您可以通过引用返回修改后的x
结构,例如structure1& x
。在后一种情况下,x指的是调用函数的对象。
答案 1 :(得分:0)
这种混乱主要是由于范围变化。
关键点:
x
)是函数的本地名称。如果全局范围变量存在名称冲突,则本地函数参数优先。案例1,您具有名为structure1
的结构的结构定义。在这个全局范围内,您还有一个名为structVar
的实例。然后在main
函数的范围内,您定义了名为structure1
的{{1}}类型的 local 变量。以下几行
x
正在修改全局范围的变量 structVar.h=4;
structVar.m=6;
structVar.s=7;
。然后你打电话
structvar
此行通过将其作为函数参数传递给func(structVar);
来修改全局变量structVar
的副本。 func
使用名称func
作为对x
的引用,但请记住,因为结构是按值传递的,所以此名称指的是您在其间传递给它的结构的副本parens - structure1
。此参数名称func(structVar)
与x
中定义的其他x
无关。它具体或作用于函数体main
。
您可以通过将函数参数的名称更改为func
来稍微探讨一下,并首先注意它不会编译,抱怨x未定义。这意味着在该函数的主体内,它不知道您在y
中定义的x
,因为 main
是本地的仅限x
。将其与main
进行对比,structVar
在任何函数的参数列表或正文之外定义。 structVar
可以在任一函数中引用,因为它的范围是全局的。
cout<<x.h<<x.m<<x.s<<endl;
使用对范围的这种理解,可以看到这一行在x
中定义的main
上运行,returnvalue
没有对其成员(h,m,s)进行初始化或分配任何值,因此'怪异'的输出。
现在,让我们看看您发布的第二个代码块。
在这里,您添加了另一个名为structVar
的全局范围结构。现在,您有两个全局范围变量returnvalue
和structVar
。由于该范围,main
在func
内可见,您正在修改其成员值(h,m,s)。
接下来,您将该全局变量作为参数x
传递给structVar
。请注意,这是func
的副本,x
调用x
。因此,structVar
的值为func
的h,m和s。
在returnValue
内,由于该全局范围,它可以看到structVar
。使用x
的副本,现在又称为returnvalue
,您将x
的值设置为参数x
的(预)递减( - )值。由于structVar
是structVar
和returnvalue
的副本,其成员设置为数字h = 4,m = 6,s = 7,func
然后接收h = 3 ,m = 5,s = 6。 main
然后返回main
。
现在,回到returnvalue
,由于main
是全局范围,cout
可以看到它并使用356
打印出其值,因此输出{{1} }}
答案 2 :(得分:0)
var backgrounds = {
Kramer: 'kramer.jpg',
George: 'george.jpg',
Elaine: 'elaine.jpg',
Jerry: 'jerry.jpg',
}
$("body").css(
"background-image",
"linear-gradient(to top, rgba(0,0,0,0.2), rgba(0,0,0,0.5)),url('file:C:/Users/user/Desktop/freecodecamp/random quote/images/" +
(backgrounds[random.author] || "bg.jpg"));
我改变了下面的一行
#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<<structVar.h<<structVar.m<<structVar.s<<endl;
}
预期输出为356