精华内容
下载资源
问答
  • 2019-02-14 10:40:37

    转载自:http://blog.csdn.net/scutth/article/details/6894975
    今天在编写代码的过程中碰到了在switch……case……的case中定义一个变量编译出错的问题,搜素了下刚好有篇博文介绍。
    [cpp] view plaincopy

    switch(n)
    {
    case 1:int i=0;break;
    case 2:…;break;
    case 3:…;break;
    default:…
    }

    编译器会报错:

    [cpp] view plaincopy

    错误: 跳过了‘int i’的初始化
    如果我们这样写(在变量定义的地方加上"{}"):

    [cpp] view plaincopy

    switch(n)
    {
    case 1:{int i=0;}break;
    case 2:…;break;
    case 3:…;break;
    default:…
    }

    编译器就不会报错。

    原因如下:

    C++编译器考虑了如下的情况:倘若在case 1中定义了一个变量,由于case 1和case 2都在同一个作用域,因此case 2可以调用case 1的变量;如果case 2这样做了,看看会发生什么情况——n的值为2,那么将会跳过case 1而执行case 2 ,但case 2调用的case 1的变量还没有定义,因此会发生错误!

    为了防止这样情况,就需要在case 1中定义变量的部分加上"{}",以限制变量的作用域(防止被case 2调用),从而防止出错。

    假设case 2一定要调用case 1中的变量,那就把这个变量定义成全局变量。

    更多相关内容
  • switch语句中case后面的值必须是常量。因为switch语句中,会根据case标签后面的常量值,生成跳转表,只经过少数次数的比较,就可以跳到对应标签下面;如果允许变量,switch对于一个数据也只能从头到尾地进行比较,这...

    switch语句中case后面的值必须是常量。因为switch语句中,会根据case标签后面的常量值,生成跳转表,只经过少数次数的比较,就可以跳到对应标签下面;如果允许变量,switch对于一个数据也只能从头到尾地进行比较,这就失去了意义。

    switch语句中case后面的值必须是常量。

    因为C语言中的 switch 不是 if 的替代品。

    编译时会对 switch 进行优化,根据 case 标签后面的常量值,生成跳转表,只经过少数次数的比较,就可以跳到对应标签下面。

    所以,标签也是不能重复的。如果允许变量,switch 只能退化成跟一连串的 if else, 对于一个数据也只能从头到尾地进行比较,也就失去了 switch 的意义。

    跳转表和逐个比较,这两种方式的复杂度差很多。

    这也是 python 没有引入和 C 语言里面的 switch case 相对应的控制结构的一个原因。

    一般表达式:switch (表达式)

    {

    case 常量表达式1: 语句1

    case 常量表达式2: 语句2

    case 常量表达式n: 语句n

    default: 语句n+1

    }

    switch 是“开关”的意思,它也是一种“选择”语句,但它的用法非常简单。switch 是多分支选择语句。说得通俗点,多分支就是多个 if。

    从功能上说,switch 语句和 if 语句完全可以相互取代。但从编程的角度,它们又各有各的特点,所以至今为止也不能说谁可以完全取代谁。

    当嵌套的 if 比较少时(三个以内),用 if 编写程序会比较简洁。

    但是当选择的分支比较多时,嵌套的 if 语句层数就会很多,导致程序冗长,可读性下降。

    因此C语言提供 switch 语句来处理多分支选择。所以 if 和 switch 可以说是分工明确的。在很多大型的项目中,多分支选择的情况经常会遇到,所以 switch 语句用得还是比较多的。

    推荐教程:《C语言》

    展开全文
  • 但是当我今天早些时候运行代码时,eclipse给了我一个错误,用红色突出显示case语句并说:case表达式必须是常量表达式,它是常量我不知道发生了什么。 这是我的代码如下:public void onClick(View src){switch(src....

    我的switch-case语句昨天运行得很好。 但是当我今天早些时候运行代码时,eclipse给了我一个错误,用红色突出显示case语句并说:case表达式必须是常量表达式,它是常量我不知道发生了什么。 这是我的代码如下:

    public void onClick(View src)

    {

    switch(src.getId()) {

    case R.id.playbtn:

    checkwificonnection();

    break;

    case R.id.stopbtn:

    Log.d(TAG,"onClick: stopping srvice");

    Playbutton.setImageResource(R.drawable.playbtn1);

    Playbutton.setVisibility(0); //visible

    Stopbutton.setVisibility(4); //invisible

    stopService(new Intent(RakistaRadio.this,myservice.class));

    clearstatusbar();

    timer.cancel();

    Title.setText("");

    Artist.setText("");

    break;

    case R.id.btnmenu:

    openOptionsMenu();

    break;

    }

    }

    所有R.id.int都用红色加下划线。

    你能提供R.id.playbtn等的定义吗? 一切都是静态的和最终的吗

    可能你删除/修改了你的布局,那些id不再存在或类似的东西......

    类R通常由IDE / dev工具生成,因此对于正在使用的Android版本通常是正确的。

    我的R.id. *都很好,存在于android的gen类中。它也在主布局中。

    在常规的Android项目中,资源R类中的常量声明如下:

    public static final int main=0x7f030004;

    但是,从ADT 14开始,在库项目中,它们将被声明为:

    public static int main=0x7f030004;

    换句话说,常量在库项目中不是最终的。

    因此,您的代码将不再编译。

    解决方案很简单:将switch语句转换为if-else语句。

    public void onClick(View src)

    {

    int id = src.getId();

    if (id == R.id.playbtn){

    checkwificonnection();

    } else if (id == R.id.stopbtn){

    Log.d(TAG,"onClick: stopping srvice");

    Playbutton.setImageResource(R.drawable.playbtn1);

    Playbutton.setVisibility(0); //visible

    Stopbutton.setVisibility(4); //invisible

    stopService(new Intent(RakistaRadio.this,myservice.class));

    clearstatusbar();

    timer.cancel();

    Title.setText("");

    Artist.setText("");

    } else if (id == R.id.btnmenu){

    openOptionsMenu();

    }

    }

    http://tools.android.com/tips/non-constant-fields

    您可以使用以下命令快速将switch语句转换为if-else语句:

    在Eclipse中

    将光标移动到switch关键字并按Ctrl + 1然后选择

    Convert 'switch' to 'if-else'.

    在Android Studio中

    将光标移动到switch关键字并按Alt + Enter然后选择

    Replace 'switch' with 'if'.

    我将我的switch-case语句更改为else-if语句..它只是让我想知道我创建一个新的android项目并使用switch-case语句并正常工作..

    可能是您的第一个项目正在使用库项目,而您的新项目则不是。

    我不明白抱歉我真的是初学者..你能解释一下吗?

    你的答案正是我所需要的。我刚刚将一个应用程序项目转换为一个库项目并且遇到了一些错误,并且没有注意到最终的关键字已经从常量声明中删除了。在看完你的答案之后,马上看到我的常量btnSave的旧声明是:public static final int btnSave = 0x7f0a001f;而库的那个是:public static int btnSave = 0x7f0a001f;

    至少eclipse会让你自动将开关转换为if / else。单击switch关键字。然后点击ctrl-1

    棒极了!我会把它添加到我的答案中。

    那么,为什么switch特别不允许呢?

    编译器需要在编译时知道表达式。如果没有final关键字,则可以在运行时更改变量。

    请注意,final是不够的。如果通过方法创建final变量的值,则遗憾的是它也不起作用。

    特别感谢自动将开关/盒转换为if / else的快捷方式!

    取消选中项目中的"Is Library"属性对我有用。

    在...后清理和重建很重要

    右键单击您的项目名称。然后单击属性 - > Android。在弹出窗口的右下角是一个标有"图书馆"的部分。在其下,如果选中"is Library"选项,如果您不希望项目成为库项目,请取消选中它。然后清理并重建。如果您希望它是一个库项目,那么您必须将切换更改为if else条件,如其他地方所述。

    库项目标有"Is Library"的原因有多种。这不是解决问题的正确方法 - 它会破坏您的Android项目结构,使应该像常规应用程序一样的库。

    解决方案可以这样做:

    只需将值赋给Integer即可

    将变量变为最终变量

    例:

    public static final int cameraRequestCode = 999;

    希望这会帮助你。

    "决赛"成功了。

    这个问题的简单解决方案是:

    单击开关然后按CTL + 1,它会将您的开关更改为if-else阻止语句,并将解决您的问题

    R.id. *,因为ADT 14不再被声明为final static int所以你不能在switch case构造中使用。您可以使用if else子句代替。

    是的,我已经在tools.android.com上看到了,我也尝试创建一个新项目,并使用上面的代码,它工作得很好..那是怎么回事?

    tools.android.com/recent/buildchangesinrevision14请参阅"图书馆项目改造"部分

    为什么他们做出这种改变是没有意义的。

    这个其他解决方案如何保持漂亮的开关而不是if-else:

    private enum LayoutElement {

    NONE(-1),

    PLAY_BUTTON(R.id.playbtn),

    STOP_BUTTON(R.id.stopbtn),

    MENU_BUTTON(R.id.btnmenu);

    private static class _ {

    static SparseArray elements = new SparseArray();

    }

    LayoutElement(int id) {

    _.elements.put(id, this);

    }

    public static LayoutElement from(View view) {

    return _.elements.get(view.getId(), NONE);

    }

    }

    所以在你的代码中你可以这样做:

    public void onClick(View src) {

    switch(LayoutElement.from(src)) {

    case PLAY_BUTTTON:

    checkwificonnection();

    break;

    case STOP_BUTTON:

    Log.d(TAG,"onClick: stopping srvice");

    Playbutton.setImageResource(R.drawable.playbtn1);

    Playbutton.setVisibility(0); //visible

    Stopbutton.setVisibility(4); //invisible

    stopService(new Intent(RakistaRadio.this,myservice.class));

    clearstatusbar();

    timer.cancel();

    Title.setText("");

    Artist.setText("");

    break;

    case MENU_BUTTON:

    openOptionsMenu();

    break;

    }

    }

    枚举是静态的,因此影响非常有限。唯一需要关注的窗口是双重查找(首先在内部SparseArray上,后来在switch表上)

    也就是说,这个枚举也可以用来以流畅的方式获取项目,如果需要的话,通过保持对id的引用......但这是其他时间的故事。

    由于内存臃肿,Android不鼓励枚举;这也是他们从未在AOSP中使用过的主要原因 - 也就是你到处看到它们的原因。

    stackoverflow.com/questions/5143256/

    当我在我的类中声明变量的函数中使用switch时,它会抛出这个错误:

    private void ShowCalendar(final Activity context, Point p, int type)

    {

    switch (type) {

    case type_cat:

    break;

    case type_region:

    break;

    case type_city:

    break;

    default:

    //sth

    break;

    }

    }

    当我向类的开头的变量声明final时,问题就解决了:

    final int type_cat=1, type_region=2, type_city=3;

    在这种情况下,enum是int的更好替代品。该方法的调用者将无法使用无效类型调用该函数。

    我有特定的int类型,所以如果我使用整数它是好的。但是,我想知道enum的一个例子:D

    i have specific int types so its ok if i use ints没有意义。关于枚举示例:docs.oracle.com/javase/tutorial/java/javaOO/enum.html

    我的意思是函数中传入的int变量类型将始终是这三种类型之一,因此它不会破坏任何东西,这要归功于枚举示例:)

    i mean that the incoming int variable type in the function will always be one of these 3 types so it won't break anything这是你的假设。其他人可以使用任意数字错误地调用该函数。使用enum,您无需假设,它由语言强制执行。

    嗯好你的论证是真的,如果其他人不知道如何调用该函数或传递错误的int输入但有人可以放入默认分支返回false如果他将函数的返回也更改为布尔值。无论如何,我认为它是一种更好的方法来调用用户预设的枚举变量的函数。

    我想提一下,当我尝试在我的项目中添加一个库时,我遇到了同样的情况。突然间所有switch语句都开始显示错误!

    现在我试图删除我添加的库,即使它不起作用。

    然而,"当我清理项目时"所有错误都消失了!

    展开全文
  • c语言的switch case语句

    千次阅读 2021-05-19 10:44:26
    switch……case语句中,switch后面跟一个变量,这个变量不可以是字符数组,字符指针,字符串数组,浮点型(实型)。它可以是整型,字符型(本质上也是整型)。所以这导致case后面的常量表达式只能是整型和字符型,不...

    switch……case语句中,switch后面跟一个变量,这个变量不可以是字符数组,字符指针,字符串数组,浮点型(实型)。它可以是整型,字符型(在本质上也是整型)。所以这导致case后面的常量表达式只能是整型和字符型,不可以是字符串,字符数组,实型等等类型。这一切都是在c语言中的。在java中有所不同,java中是可以跟字符串的。

    这是为什么呢?这就说到了字符和字符串的区别的了。

    形式上: 字符常量是单引号引起的一个字符;字符串常量是双引号引起的若干个字符;

    含义上: 字符常量相当于一个整型值,可以参加表达式的运算;字符串常量代表一个地址值(该字符串在内存中存放的位置);

    占内存大小:字符常量只占一个字节;字符串常量占若干个字节,(至少一个字符结束标志)

    所以如果可以使用字符串是判断了一个位置,这就相当于判断说这个物体是不是香蕉,而你的判断是它在桌子上,这显然是不合适的。所以,后面是不可以为字符串的。

    PS:自己的理解,若有错误,请帮忙矫正!

    C语言中switch case语句可变参实现方法(case 参数 空格...空格 参数 :)

    正常情况下,switch case语句是这么写的: : : ... ;break ; default : ... ;break ; } 接下来说一种不常见的,但是对于多参数有很大的帮助的写法: 先给一 ...

    为什么switch...case语句比if...else执行效率高

    在C语言中,教科书告诉我们switch...case...语句比if...else if...else执行效率要高,但这到底是为什么呢?本文尝试从汇编的角度予以分析并揭晓其中的奥秘. 第一步,写一个d ...

    python技巧 switch case语句

    不同于C语言和SHELL,python中没有switch case语句,关于为什么没有,官方的解释是这样的 使用Python模拟实现的方法: def switch_if(fun, x, y):    ...

    为什么说在使用多条件判断时switch case语句比if语句效率高?

    在学习JavaScript中的if控制语句和switch控制语句的时候,提到了使用多条件判断时switch case语句比if语句效率高,但是身为小白的我并没有在代码中看出有什么不同.去度娘找了半个小 ...

    java中的Switch case语句

    java中的Switch case 语句 在Switch语句中有4个关键字:switch,case break,default. 在switch(变量),变量只能是整型或者字符型,程序先读出这个变量的 ...

    switch… case 语句的用法

    switch… case 语句的用法   public class Test7 { public static void main(String[] args) { int i=5; switch(i ...

    if语句,if...else if语句和switch...case语句的区别和分析

    前段时间在工作中遇到了一个关于条件判断语句的问题,在if语句,if else if语句和switch case语句这三者之间分析,使用其中最有效率的一种方法. 所以就将这个问题作为自己第一篇博客的主要 ...

    Python | 基础系列 · Python为什么没有switch/case语句?

    与我之前使用的所有语言都不同,Python没有switch/case语句.为了达到这种分支语句的效果,一般方法是使用字典映射: def numbers_to_strings(argument): sw ...

    JavaScript基础知识(if、if else、else if、while、switch...case语句)

    13.语句 概念:就是分号(:) 代表一条语句的结束 习惯:一行只编写一条语句:一行编写多条语句(代码可读性较差) 语句块:可以包含多条语句     "{ }"将多条语句包裹 u ...

    随机推荐

    Node开发入门

    介绍 Node.js采用google的V8虚拟机来解释和执行javascript,也就是允许脱离浏览器环境运行javascript代码. Hello World 婴儿说的第一个字一般是"妈& ...

    time_t

    所在的头文件为 time.h 定义为: #ifndef __TIME_T #define __TIME_T     /* 避免重复定义 time_t */ typedef long     time_ ...

    linux 文件系统操作()

    1. 用Xshell 客户端连上远程主机. 2.ll 或 ls 查看当前目录下的文件或目录, cd / 切换到根目录, cd **切换到某个目录(或者叫进入某个文件夹) 3.文件的压缩命令:zip - ...

    统计数据方面SQL与HQL

    因为HQL是面向对象的,所以对于统计数据方面使用HQL时不合适的,其实HQL最终还是会转化成SQL语句,项目里使用HQL语句应该是为了标准规范化. 统计的数据:同一个表,同一个字段,不同属性,统计不同 ...

    linux系统mysql-5.7 修改字符集

    起因:我在网上看修改mysql字符的文章时,都说配置/etc/mysql/my.cnf文件 然而我打开我上述的my.cnf文件时,发现里面的内容跟别人的不一样,我就觉得这个肯定不是正确的文件 经过我在 ...

    说一说MVC的CompressActionFilterAttrubute(五)

    通过action对文件流压缩,提高带宽速度!!! 引用using System.IO.Compression; public override void OnActionExecuting(Actio ...

    Hailstone冰雹序列问题

    在复习数据结构,课程中提到Hailstone冰雹序列问题,问题如下 代码如下: public List Hailstone(int n) { List li ...

    [z]分区truncate操作的介绍及对全局索引和空间释放影响的案例解析

    [z]https://www.2cto.com/database/201301/181226.html 环境: [sql] [oracle@localhost ~]$ uname -r 2.6.18- ...

    C#集成FastDFS断点续传

    C#集成FastDFS断点续传 参考 .net版本FastDFS客户端v5.05. https://github.com/zhouyh362329/fastdfs.client.net FastDFS ...

    input 控件监听回车确认按钮。

    前端开发的同学捕捉回车按键经常会用到 if(event.keyCode == 13){ console.log("点击了回车按键");} 但是在微信上面,我们一般会用到指令 bin ...

    展开全文
  • 常规的Android项目,资源R类的常量声明如下:public static final int main=0x7f030004;但是,从ADT 14开始,库项目,它们将被声明为:public static int main=0x7f030004;换句话说,常量库项目不是...
  • c语言switch中case语句

    千次阅读 2021-05-21 13:45:46
    switch嵌套语句的一般形式: switch(表达式) case常量1:语句1 case常量2:switch(表达式) {case常量1:语句1 case常量2:语句2case常量n:语句 因此C语言switch case语句是判断语句,用switch来判断case后面的表达式...
  • verilog case语句_verilog语法进阶

    千次阅读 2020-11-21 08:21:37
    欢迎FPGA工程师加入官方微信技术群模块的结构、数据类型、变量和基本运算符号3.1.模块的结构Verilog的基本设计单元是“模块”(block)。...许多方面,程序模块和电路图符号是一致的,这是因为电路图符号的引脚也就...
  • SQL中case语句错误

    2020-04-27 10:06:00
    SQL中case语句错误case语句错误错误sql语句正确sql语句 case语句错误 当字段为varchar类型时,使用case语句就必须用 ’ ’ 把相应的值给包起来。不管字段放的int类型的值。 例子:如:CC varchar → CC为0 、 ...
  • Verilog初级教程(17)Verilogcase语句

    万次阅读 多人点赞 2020-07-19 16:34:46
    case语句检查给定的表达式是否与列表的其他表达式之一相匹配,并据此进行分支。它通常用于实现一个多路复用器。
  • 但是当我今天早些时候运行代码时,eclipse给了我一个错误,用红色突出显示case语句并说:case表达式必须是常量表达式,它是常量我不知道发生了什么。这是我的代码如下:public void onClick(View src){switch(src....
  • Java的switch case语句

    2021-12-04 19:18:04
    Java的switch case语句
  • C++的switch case 语句

    万次阅读 2019-04-18 10:45:00
    接触流程控制语句switch case的时候,感觉这个很有意思,就花了点时间去慢慢的去深入了解它,并且和if语句一起嵌套使用,就找了个题目来练练手, 这个就是通过输入年份和月份,来判断年份是否为闰年,并且可以知道...
  • shellcase语句详解

    千次阅读 2020-02-19 16:39:31
    case…in… 语句 和其它编程语言类似,Shell 也支持两种分支结构(选择结构),分别是 if else 语句case in 语句。 当分支较多,并且判断条件比较简单时,使用 case in 语句就比较方便了 case in 的用法基本格式...
  • java的switch case语句

    2021-01-03 22:08:34
    switch-case语句格式如下: switch(变量){ case 变量值1: //; break; case 变量值2: //...; break; ... case default: //...; break; } swtich()变量类型只能是int、short、char、byte和enum类型(JDK 1.7 ...
  • 展开全部 switch 语句中使用break语句将终止语句的序列。当遇到 Break语句时,程序将整个 switch 语句后面的一62616964757a686964616fe78988e69d8331333365646261行代码处开始执行,就有一种跳出switch 语句的效果...
  • C语言switch case语句详解

    万次阅读 多人点赞 2020-02-22 10:36:58
    当分支比较少的时候我们使用if else语句解决,当分支比较多的时候,我们要使用switch case语句解决,针对分支的复杂性选择合适的程序解决。 当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对...
  • if语句与case语句

    千次阅读 2021-09-07 15:08:26
    case语句 总结 前言 当我们掌握了条件测试就可以尝试结合语句来完成简单脚本的书写。 if语句 单分支 #基本格式 if 条件测试操作 then 命令序列 fi vim test1.sh #!/bin/bash i=10 #给变量i赋值10 if [ $...
  • java的switch case语句switch-case语句格式如下:?swtich()变量类型只能是int、short、char、byte和enum类型(JDK 1.7 之后,类型也可以是String了)。当进行case判断时,JVM会自动从上到小扫描,寻找匹配的case,...
  • Verilog编程之道 - case语句

    千次阅读 2021-12-09 15:38:51
    case语句,是包含case和endcase之间的代码,逻辑上等价于if-else语句,使用方法如下: case (case_expression) case_item1 : case_item_statement1; case_item2 : case_item_statement2; case_item3 : ...
  • Verilog的if或者case语句十分简单,但确实十分重要,我们的逻辑设计可以说一定离不开它,我们时时刻刻使用它,我们使用它进行建模,通常对应的是多路选择器这样的硬件单元或者变种。
  • int main(void) { int c = 0; switch(c) { int a = 3; printf("a = %d\n", a);... case 1: printf("a = %d\n", 1); break; case 2: printf("a = %d\n", 2); break; case 3: printf("a = %d\
  • Mysql之case语句(附带实例)

    千次阅读 2021-01-18 20:55:48
    这段时间,做项目做累了,好不容易有点个人的学习时间,利用这个小时,总结一下,最近做统计的时候常用的case语句吧。结构:case when… then …end1.判断的同时改变其值eg:select OperatorAccount,casewhen ...
  • }或者如果你必须使用switch语句,你可以这样做:switch(i) {case "+":case "/":setOperator("i");break;}基本上,你不可能像你想象的那样拥有多个案例.它与if语句的结构不同,您可以其中执行各种逻辑操作. Java没有...
  • Javaswitch case语句中声明变量

    千次阅读 2020-04-27 21:48:03
    Javaswitch case语句中声明变量 Java使用switch case语句时很容易出现以下两个报错: 1、Duplicate local veriable out. (局部变量重复) 2、The local veriable out may not have been initialized. (局部...
  • 本文给大家介绍php的switch语句的用法实例详解,涉及到switch用法方面的知识点,对switch用法感兴趣的朋友通过本文一起学习吧switch是一个开关语句,那么很多朋友都只知道简单的switch开关语句的用法了,下面一聚...
  • c语言的switchcase语句用法

    千次阅读 2021-05-24 00:34:41
    凡是使用过的人都会有同2113样的感觉—5261—C语言的使用灵活这个特点既是优点又是4102缺点, 因为对1653精通C语言的用户来讲... 而实际上,C 语言和其它计算机语言一样, 只要你真正掌握了该语言的每一个语句的特点...
  • 标准的SQL语言是不支持if这些判断语句的,如果要加入条件,一般得用到where子句。比如,要查找customer表...表达式可以使用CASE语句达到IF()的效果。例如:SELECTMAX(CASEWHENField1>=Field2THENField1ELSE...
  • 【单选题】下列关于switch语句描述,正确的是?A. switch 语句中default子句是可以省略的B. switch 语句中case子句的语句序列必须包含break语句C. swit更多相关问题下列关于演替趋势的叙述,错误的是()A. 一般来说...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 223,159
精华内容 89,263
关键字:

在case语句中错误的是