Sian 发表于 2014-2-26 12:09:03

关于作用域的一个例子

代码示例一:
#include <stdio.h>

int main() {
    if (5 < 6)
      printf("Code test1...\n");

    printf("Code test2...\n");

    return 0;
}
代码示例二:#include <stdio.h>

int main() {
    if (5 < 6)
      int a = 1;

    printf("Code test2...\n");

    return 0;
}
这两段代码中,唯一不同的地方是将示例一中的“ printf("Code test1...\n");”改成了代码二中的“int a = 1;",造成的结果是代码二编译无法通过,为什么呢?作用域的问题!
这两段示例代码存在一个问题,即if语句后面没有带{},正常的理解,编译器只将条件判断后的第一条语句与其绑定,然而也有可能判断后的执行语句为空的情况,如果为空,那int a = 1;则为全局变量定义,如果绑定第一条语句,则int a = 1;为if语句内的局部变量。

无法判断变量的作用域,为避免这种情况的发生,最好的方法即养成良好的编程习惯!


Sian 发表于 2014-2-26 15:37:49

同样的问题在switch中也存在,比如以下代码:
#include <stdio.h>

int main() {
    int a = 10;
    int b = 5;
    char c = '+';
    switch (c){
    case '+':
            int sum = a + b;
            printf("sum is %d", sum);
            break;
    case '-':
            int minus = a - b;
            printf("minus is %d", minus);
            break;
    }
    return 0;
}
case'+' 与 case'-' 两者是互斥关系,但在编译器看来,他们处于同一作用域(编译器通过{}来区分作用域),存在冲突,因而编译不通过,所以要以{}将代码块区分开来:#include <stdio.h>

int main() {
    int a = 10;
    int b = 5;
    char c = '+';
    switch (c){
    case '+':
      {
            int sum = a + b;
            printf("sum is %d", sum);
            break;
      }
    case '-':
      {
            int minus = a - b;
            printf("minus is %d", minus);
            break;
      }
    }
    return 0;
}



页: [1]
查看完整版本: 关于作用域的一个例子