我目前正在尝试了解我通过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);
}
答案 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)
规则很简单,在每个{...}(块)中,您都可以引用在该块中定义的变量或其任何“父级”。例如,在您的代码中:
请注意,您始终在打印“主件x”,仅在主件中递增。 正如@Jens所指出的那样,C中的父作用域称为封闭块,全局作用域称为程序作用域(文件作用域+外部作用域)