C++中switch 语句中的变量声明和

switch 内部的变量定义:

 1 int i = 1;
 2 switch(i)
 3 {
 4     case 0:
 5         string str;            //error
 6         int val1 = 0;        //error
 7         int val2;              //right
 8         int val3; val3 = 0; //right
 9     case 1:
10         val2 = 9;
11         cout << val2 << endl;
12 }

《C++ Primer》 P163: 如果在某处一个带有初始值的变量位于作用域之外,在另一处该变量位于作用域之内,则从前一处跳转到后一处的行为是非法行为。

在上面的代码中line 5、6是错误的,line 7、8是没问题的。

首先要明确的是,对于line 5、6、7、8中的变量来说,整个switch语句的{}内的声明之后的范围都是可见的。case语句不构成独立的作用域,即在case 0:下定义的val2,在case 1下也是可见的(红色字体貌似有问题)。

但是line5、6是错误的,因为在5、6两行都在声明变量时对变量进行了初始化(line 5 调用了默认的初始化函数),如果跳过此代码,则可能会产生不可意料的错误,编译器会报错。line 7、8是正确的,因为在声明的时候并没有对变量初始化。

所以,不可以跳过带初始值的变量(同一个作用域之内)。 在goto语句中同理:

1 int i = 1;
2 goto case_1;
3
4 case_0:
5     int val1;        //right
6     int val2 = 9; //error
7 case_1:
8     val1 = 9;
9     val2 = 10;
test_scope.cpp: In function ‘int main(int, char**)’:
test_scope.cpp:7: error: jump to label ‘case_1’
test_scope.cpp:2: error:   from here
test_scope.cpp:6: error:   crosses initialization of ‘int val2’ (跳过了val2的初始化)
时间: 2024-10-28 16:02:37

C++中switch 语句中的变量声明和的相关文章

java中switch语句中的defaul条件的位置

在java中switch语句中,每个case分支就是一个入口,如果都没有满足条件,那么将会走到default分支中.那么这个default分支的位置会不会影响到执行的流程呢? package com.app.statement; import java.util.Scanner; /**  * Created by charles on 2015/7/12.  */ public class SwitchTest {     public static void main(String[] ar

java7 语法糖 之 switch 语句中的string

Jdk7新增的switch 语句中常量可以string类型, 例如: @Test public void test_1(){ String string = "hello"; switch (string) { case "hello": System.out.println(string); break; default: throw new IllegalArgumentException("非法参数"); } } 语法糖的背后,其实用的对待

java7 switch语句中使用字符串的背后原理

先看下代码及反编译后的代码: /**  * @author doctor  *  * @time 2015年3月28日 下午3:26:06  */ public class StringForSwitch { @Rule public ExpectedException ex = ExpectedException.none(); @Test public void test_string_switch() { String result=""; switch ("docto

switch语句中break的巧用

大家都知道,break的作用就是终止它所在的switch语句后循环语句的执行.在这里呢,我们不去探讨break在循环里的终止作用,也不去回忆在循环里是跳出本层循环,不去研究它与continue或者return的区别.在这里,我们简简单单的谈一下,它在switch语句中的利用. 有这样一道编程题目:输入某年某月某日三个值,判断这是这一年的第几天.一般的情况,我们会这样写代码: #include<stdio.h> void main() { int year,month,day,num; prin

1.3.1 switch 语句中的 String

switch语句是一种高效的多路语句,可以省掉很多繁杂的嵌套if判断: 在Java 6及之前,case语句中的常量只能是byte.char.short和int(也可以是对应的封装类)或枚举常量,在Java 7规范中增加了String,毕竟它也是常量类型: Demo: public class CoinSwitchString { public static void main(String[] args) { printDay("Sunday"); printDay("Tue

swift switch语句中的标签语句

当我们在遍历中使用switch语句时有时需要终止整个遍历的进行而不是switch语句,那么标签语句的实现就是很有必要的 //可以使用标签来标记一个循环体或者switch代码块,当使用break或者continue时带上这个标签,可以控制该标签代表对象的终端或者执行,适合复杂真的控制流程 /* 要求在遇到异常数据时直接终止循环 */ var score = [96,83,43,101,66,70,-5,99] First:for s in score {//定义标签First switch s/1

Java7中Switch语句支持String

Java7新特性Swith语句中支持String 实例: public class StringSwitch { public static void main(String[] args) { System.out.println(getExpendedMessage("one")); System.out.println(getExpendedMessage("three")); System.out.println(getExpendedMessage(&qu

PHP中sql语句如何使用变量

SQL语句变量问题 先讲下单引号和双引号的问题 ''单引号 php会把它里面的内容当成字符串来处理. ""双引号 php会根据里面的值来处理.比如里面有变量 那么变量的值就会把变量替换. 例子 <?php $a='Hello Word!'; echo '$a'; echo "$a"; //这两个输出的结果是不一样的 //第一个输出就是$a //第二个输出Hello Word! //数据库查询例子: $username='admin'; $sql="s

Mybatis中sql语句中的in查询,一定要判断null的情况

不严谨的写法,可能会报错:in (),这种情况不符合mysql的语法. select from loanwhere LOAN_ID in <foreach item="item" index="id" collection="list" open="(" separator="," close=")"> #{item} 要么在Mybatis的sql文件中,要么在Java程序中