结构和函数返回值

时间:2016-07-16 22:45:28

标签: c++

我刚刚开始使用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

问题是我无法解释原因

3 个答案:

答案 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的全局范围结构。现在,您有两个全局范围变量returnvaluestructVar。由于该范围,mainfunc内可见,您正在修改其成员值(h,m,s)。

接下来,您将该全局变量作为参数x传递给structVar。请注意,这是func的副本,x调用x。因此,structVar的值为func的h,m和s。

returnValue内,由于该全局范围,它可以看到structVar。使用x的副本,现在又称为returnvalue,您将x的值设置为参数x的(预)递减( - )值。由于structVarstructVarreturnvalue的副本,其成员设置为数字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