如何判断函数何时访问局部变量或外部变量?

时间:2019-06-04 09:00:14

标签: c algorithm

我目前正在尝试了解我通过C认证测试遇到的这段代码。该代码的正确输出是12、13、13。 我尝试打印出值,然后才调用3个最终输出,并且我注意到原因是在顶部声明的外部x与函数内部的x之间存在范围差异。我的问题是,我怎么知道在整个代码中哪个函数正在访问哪个对象?

#include <stdio.h>
#include <stdlib.h>

int x; 
int modifyvalue() 
{ 
    return(x+=10); 
}
int changevalue(int x) 
{ 
    return(x+=1); 
}


int main(){
    int x=10; 
    x++; 
    printf("[1] %d \n\n", x);  
    changevalue(x); 
    printf("[2] %d \n\n", x);
    x++;
    printf("[3] %d \n\n", x); 
    modifyvalue(); 
    printf("First output:%d \n\n\n",x);
    x++; 
    changevalue(x); 
    printf("Second output:%d \n\n\n",x); 
    modifyvalue(); 
    printf("Third output:%dn \n\n\n",x);
}

2 个答案:

答案 0 :(得分:4)

始终从最近的范围获取变量。
每当调用x时,它将从函数main()中获取modifyvalue()

功能x始终在所有功能之外的changevalue(int x)上运行。

函数x始终对参数x进行操作-它是传入变量的副本。

因此,在您的情况下,这两个函数实际上对main()中的 final FirebaseAuth _auth = FirebaseAuth.instance; final GoogleSignIn googleSignIn = new GoogleSignIn(); Future<FirebaseUser> _signIn() async{ GoogleSignInAccount googleSignInAccount = await googleSignIn.signIn(); GoogleSignInAuthentication googleSignInAuthentication = await googleSignInAccount.authentication; final AuthCredential credential = GoogleAuthProvider.getCredential( accessToken: googleSignInAuthentication.accessToken, idToken: googleSignInAuthentication.idToken ); final FirebaseUser user = await _auth.signInWithCredential(credential); print("Sign In "+user.displayName); return user; } 没有任何作用。

答案 1 :(得分:2)

规则很简单,在每个{...}(块)中,您都可以引用在该块中定义的变量或其任何“父级”。例如,在您的代码中:

  • modifyvalue:没有x,x位于父级中,“全局”
  • 更改值:x是一个参数,递增该参数,更改未反映在调用方上(因为该参数是副本)
  • 主要:x是本地

请注意,您始终在打印“主件x”,仅在主件中递增。 正如@Jens所指出的那样,C中的父作用域称为封闭块,全局作用域称为程序作用域(文件作用域+外部作用域)