静态变量如何在c中起作用

时间:2017-01-28 16:58:01

标签: c static-variables

我有一个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。

有人可以解释原因吗?

3 个答案:

答案 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 并打印i4

内部编译器在流动流程中的工作:

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);
}