zoukankan      html  css  js  c++  java
  • switch case被人忽视的一点!zt

    这个分支语句怎么的用相信很多人晓得,如果碰到一个错误咋办?

    先看看程序:

    switch (t)
    {
      case 0:
      int a = 0;
      break;

      case 1:
      default:
      break;
    }

    明显报错,initialization of 'a' is skipped by ' case' label

     有两种解决方法。

    其实这一起都是由于变量的作用域作祟,switch里面的a定义了,那么他就应该在以后直到default后的“}”出现,如果t不等于0,那么程 序执行到case0后面去了,但是a的作用域一直存在,而且还一直就不让后面的“同志使用”,给看不准用,这样是不对的。这个过程发生在编译时刻识别。

    要么让作用域按照自己的想法执行,要么就把变量的识别转移到运行时刻!

    一:

    作用域缩小,把有定义新的变量且同时初始化的,放到一个花括号里面去,那么随着过程的结束,变量消失,而且也不会被后面的看到。

    这样:

     switch (a) {
      case 1: {
       int ab = 11;
       cout << ab << endl;
        }
      case 2: {
       cout << a << endl;
        }
     }

    第二:

    运行时刻识别,一个没有初始化的变量,具体值要到运行时刻才被确定,这样就可以被后文使用。我们只是声明,啥时候用的时候啥时候再给出值。

    switch (a)
    {
    case 0:
        int t;
        t= 0;
        break;
    default:
        break;
    }

    这样就没有问题了,其实这一招对类对象也是可以用的。比如:

    一个类,我们不给出显示初始化构造函数,那么他的值也是未定义的,具体的给值也要到运行时刻。

    class B
    {
     int pp;
    };

    switch (a)
    {
    case 0:
    B b;
    break;
    default:
    break;
    }

    但是一旦定义了默认构造函数,即便是一个空的函数,也是不行的,因为这样就导致了对象的创建而且初始化。

    如下就是不对的:

    class B
    {
     int pp;
    public:
     B() {}
    };

    switch (a)
    {
    case 0:
    B b;
    break;
    default:
    break;
    }

     return 0;
    }

    编译一下就可以看到如下错误:

    d:\csdnc++\1215\switchcase\switchcase\switchcase.cpp(42) :

    error C2361: initialization of 'b' is skipped by 'default' label
    loop's blog
  • 相关阅读:
    Java泛型 PECS(Producer Extends, Consumer Super)
    JDK(七)JDK1.8源码分析【集合】TreeMap
    JDK(六)JDK1.8源码分析【集合】LinkedHashMap
    JDK(五)JDK1.8源码分析【集合】HashMap
    JDK(四)JDK1.8源码分析【排序】DualPivotQuicksort
    JDK(三)JDK1.8源码分析【排序】mergeSort
    JDK(二)JDK1.8源码分析【排序】timsort
    第24天多线程技术
    第23天功能流、图形化界面、多线程
    第二十二天 字符流、缓冲区、转换流
  • 原文地址:https://www.cnblogs.com/goodloop/p/1374459.html
Copyright © 2011-2022 走看看