年年有"余"

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1925|回复: 1

关于作用域的一个例子

[复制链接]
  • TA的每日心情
    奋斗
    2022-12-13 21:26
  • 签到天数: 371 天

    [LV.9]以坛为家II

    发表于 2014-2-26 12:09:03 | 显示全部楼层 |阅读模式
    代码示例一:
    1. #include <stdio.h>
    2. int main() {
    3.     if (5 < 6)
    4.         printf("Code test1...\n");
    5.     printf("Code test2...\n");
    6.     return 0;
    7. }
    复制代码
    代码示例二:
    1. #include <stdio.h>
    2. int main() {
    3.     if (5 < 6)
    4.         int a = 1;
    5.     printf("Code test2...\n");
    6.     return 0;
    7. }
    复制代码
    这两段代码中,唯一不同的地方是将示例一中的 printf("Code test1...\n");”改成了代码二中的“int a = 1;",造成的结果是代码二编译无法通过,为什么呢?作用域的问题!
    这两段示例代码存在一个问题,即if语句后面没有带{},正常的理解,编译器只将条件判断后的第一条语句与其绑定,然而也有可能判断后的执行语句为空的情况,如果为空,那int a = 1;则为全局变量定义,如果绑定第一条语句,则int a = 1;为if语句内的局部变量。

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


  • TA的每日心情
    奋斗
    2022-12-13 21:26
  • 签到天数: 371 天

    [LV.9]以坛为家II

     楼主| 发表于 2014-2-26 15:37:49 | 显示全部楼层
    同样的问题在switch中也存在,比如以下代码:
    1. #include <stdio.h>
    2. int main() {
    3.     int a = 10;
    4.     int b = 5;
    5.     char c = '+';
    6.     switch (c){
    7.     case '+':
    8.             int sum = a + b;
    9.             printf("sum is %d", sum);
    10.             break;
    11.     case '-':
    12.             int minus = a - b;
    13.             printf("minus is %d", minus);
    14.             break;
    15.     }
    16.     return 0;
    17. }
    复制代码
    case'+' case'-' 两者是互斥关系,但在编译器看来,他们处于同一作用域(编译器通过{}来区分作用域),存在冲突,因而编译不通过,所以要以{}将代码块区分开来:
    1. #include <stdio.h>
    2. int main() {
    3.     int a = 10;
    4.     int b = 5;
    5.     char c = '+';
    6.     switch (c){
    7.     case '+':
    8.         {
    9.             int sum = a + b;
    10.             printf("sum is %d", sum);
    11.             break;
    12.         }
    13.     case '-':
    14.         {
    15.             int minus = a - b;
    16.             printf("minus is %d", minus);
    17.             break;
    18.         }
    19.     }
    20.     return 0;
    21. }
    复制代码


    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|Archiver|iOS开发笔记 ( 湘ICP备14010846号 )

    GMT+8, 2024-5-4 03:54 , Processed in 0.049638 second(s), 23 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表