我有一个c程序。但是我无法理解这个程序的输出。
if (TextUtils.isEmpty(emails) || TextUtils.isEmpty(passwords)) {
Toast.makeText(MainActivity.this, "Fields are empty", Toast.LENGTH_LONG).show();
} else {
mAuth.signInWithEmailAndPassword(emails, passwords).addOnCompleteListener(new OnCompleteListener < AuthResult > () {
@Override
public void onComplete(@NonNull Task < AuthResult > task) { /* if task not success show dialog
if (!task.isSuccessful()) {
Toast.makeText(MainActivity.this, "Sign in Problem", Toast.LENGTH_LONG).show();
}
}
});
}
}
}// end of code
我相信输出应为8,但实际输出为4。
有人可以解释原因吗?
答案 0 :(得分:5)
int i = 2;
在函数i
中定义了一个名为main
的变量。 static int i;
定义了一个名为i
的变量,其中位于 for循环中;在循环结束后,该变量不再可见。因此,在行printf("%d", i);
中,名称i
指的是在函数开头定义的i
,而不是循环内定义的i=i+8;
。
在循环体内,行i
指的是在循环体内定义的printf
。因此,如果}
行在结束循环的function dimensionLabels(d) {
return __.dimensions[d].title ? __.dimensions[d].title : d; // dimension display names
}
之前出现,则会显示该变量的值。但是,这个价值不会是8;试一试,看看。
答案 1 :(得分:4)
因为您的printf
函数会打印局部变量i
值。 static int i
范围仅在for
循环内。
当您的本地变量i
变为4 <= 3时,请调整 false 并打印i
值4
。
内部编译器在流动流程中的工作:
local i condition static i operation
i = 0 0 <= 3(true) i = 0 i = 0(static) + 8
i = 1 1 <= 3(true) i = 8 i = 8(static) + 8
i = 2 2 <= 3(true) i = 16 i = 16(static) + 8
i = 3 3 <= 3(true) i = 24 i = 24(static) + 8
i = 4 4 <= 3(false)
然后打印i = 4
。
答案 2 :(得分:3)
由于i
循环中的for
会影响另一个i
,因此为了清晰起见,我们使用不同的名称重新编写。
int main(){
// int i=2;
int outside_i=2;
// for(i=0;i<=3;i++){
for(outside_i=0;outside_i<=3;outside_i++){
// static int i;
static int inside_i;
// i=i+8;
inside_i=inside_i+8;
}
// printf("%d",i);
printf("%d",outside_i);
}
这简化为
int main(){
int outside_i=2;
for(outside_i=0;outside_i<=3;outside_i++){
; // do stuff that does not affect outside_i
}
printf("%d",outside_i);
}
进一步
int main(){
int outside_i;
outside_i=0;
outside_i++;
outside_i++;
outside_i++;
outside_i++;
printf("%d",outside_i);
}