【问题标题】:Is it possible to access function parameters after returning from a function? [closed]从函数返回后是否可以访问函数参数? [关闭]
【发布时间】:2013-11-13 14:54:10
【问题描述】:

有什么方法可以在函数返回后(即在调用函数中)访问函数参数?

例子:

void add (float a , float b) {
    int c;
    c=a+b;
    return c;
}

void main () {

    add (3,4);

    if (a <4 && b<3) // a and b are variable in add functions
        printf("a is 4 and b is 3");
}

【问题讨论】:

  • 很抱歉这么说,但是这段代码没有任何意义。我建议你先开始阅读有关 c 的书籍或教程
  • 你听说过全局变量或变量作用域吗?
  • 你想解决什么问题?
  • a & b 仅定义为add() 的函数参数,并且在该函数之外,它们不存在。有关详细信息,请参阅下面的答案。

标签: c parameters scope


【解决方案1】:

一旦执行离开函数,就无法再访问参数。您需要将它们临时存储在调用函数中以便能够再次访问它们:

int main ()
{

    float a = 3.0f, b = 4.0f;
    add (a, b);

    if (fabs(a - 4.0f) < 0.005f && fabs(b - 3.0f) < 0.005f) // a and b are now local variables
        printf("a is 4 and b is 3");
}

更多信息请参见Scope vs. Lifetime of Variable。

其他一些事情:

  1. main 的返回类型应该是int。
  2. 您正在检查 a &lt; 4 &amp;&amp; b &lt; 3 以查看 a 是否等于 4 和 b 是否等于 3,这是不对的。
  3. 您应该养成不检查浮点值是否相等的习惯。最好检查它们是否彼此靠近。
  4. 您的add 函数应该有一个非空返回类型,可能是float。 (帽子提示:@ajp15243)
  5. 虽然不违法,但以某种方式使用函数的返回值是正常的。

【讨论】:

  • add 函数也应该有一个非void 返回类型,如果 OP 要在其中返回 c。
  • @ajp15243 好收获!我已更新我的帖子以反映您的评论...
【解决方案2】:

局部变量 a 和 b 在您退出函数时被销毁,所以 - 不,您不能这样做。

另外,您将add 定义为void,而它应该是int(因为它显然返回c)。

【讨论】:

    【解决方案3】:

    您可以让函数返回变量,您只需将单词“void”更改为您想要返回的变量。所以对于你的情况:

    void add (float a, float b)
    

    会

    int add (float a, float b)
    

    因为看起来你想要返回一个 int 变量,但我认为如果你只是让返回变量是一个浮点数会更好。

    【讨论】:

    • 你能想出一个更好的 选项来让 OP 将其用作add() 的返回类型吗? (添加两个浮点数)
    • 我只关注他的流程,因为他确实将变量 c 声明为 int。当然返回浮点数会更好,但这并不意味着你必须这样做:P
    【解决方案4】:

    没有。

    你需要了解scope和storage。

    • 在函数中定义的变量的范围仅限于该函数。
    • 函数中声明的变量存储在函数调用对应的stack框架中,所有这些变量在函数返回时都被销毁。

    【讨论】:

      【解决方案5】:

      我不是 C 程序员,但不管是哪种语言,我认为您目前的努力有些误导。不要太拘泥于您使用的语言,重点是编写结构良好的代码,因为许多概念超越了特定语言。今天的大多数语言都被认为是“Turning Complete”,基本上意味着你可以用一种语言写出你可以用另一种写出的东西。

      话虽如此,您有一个 add 函数,它接受两个参数,然后将这两个参数相加并返回值。您传递的那些参数的范围在 add 功能块内。它们仅作为您在像 add(4, 3) 一样实际调用函数时传入的参数的参考。

      所以你可以在你添加函数的原因中移动你的 if 条件语句,就像我在调用你的 add 函数时所说的那样,参数将具有价值,你可以检查它。

      这就是为什么你可以说 a + b。因为当您调用 add 时,这些变量就是您传递给函数的内容。希望这是有道理的。快乐编码!

      【讨论】:

        【解决方案6】:

        有什么方法可以使用函数中定义的变量值在程序中调用

        不,不是你写的那样

        如果您现有的代码(在原始帖子中)通过以下方式修改会不会更有意义:
        1)返回类型必须是浮点数add() 函数
        2) 在main() 中,没有理由测试a 和b,它们不在scope 在 add() 函数之外。
        3) 在 printf 语句中使用 add() 函数的结果查看结果。
        4) 不是绝对要求,但建议 main() 的最小原型为 int main(void)
        5) 如果您在任何函数之外的某个位置,靠近文件,那么它们的范围将允许您在main() 中使用它们。但是,不是一个好的做法,在同一文件中创建与函数中使用的参数名称相同的全局变量。

        (见内嵌 cmets 的解释)

        float add (float a , float b) {//must return float, you already have a return statement
            float c;//from int to float (because that matches the argument types being evaluated)
            c=a+b;
            return c;
        }
        
        float x = 5.0; //these are variables with global scope, meaning they exist and can be  used in every function
        float y = 7.2;
        
        int main (void) {//change from void main() to int main(void)
            float z=0;
        
            z = x + y;//legal statement summing globals x & y and storing in local z 
        
            //add (3,4);//used in printf below
        
            //if (a <4 && b<3) // a and b are variable in add functions (this is meaningless in context of an add function
        
            //call the add() function, with float arguments, from here, and print out the results in one step.   
            printf("results of add are: %f", add(3.0,4.0));//change from 3 to 3.0 (just to be anal)
        }
        

        【讨论】:

        • 对不起,这个不好的例子,我只想问在主程序中调用浮动值“a”和“b”的任何方式。因为我已经在单独的函数中分配了这些值,所以我可以在主程序中调用这些值吗?
        猜你喜欢
        • 1970-01-01
        • 2012-06-26
        • 2020-10-03
        • 2018-02-25
        • 1970-01-01
        相关资源
        最近更新 更多