首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么switch-case会出现`警告:控制到达非空函数末尾`?

switch-case语句在执行时,需要确保每个case都有对应的逻辑处理,并且每个case的末尾都要有跳出语句(如break)或者返回语句。如果在某个case中没有加上跳出语句,或者在最后一个case中没有加上返回语句,则会出现警告"控制到达非空函数末尾"。

这个警告的出现是为了防止在switch-case语句中遗漏了逻辑或者错误地执行了多个case的逻辑。如果没有加上跳出语句或者返回语句,程序将会继续执行下一个case的逻辑,这可能会导致程序运行的不正确或者出现逻辑错误。

解决这个警告的方法有两种:

  1. 在每个case的逻辑处理完毕后,加上跳出语句(如break)或者返回语句。这样可以确保每个case的逻辑执行完毕后跳出switch-case语句。
  2. 在最后一个case中加上返回语句。这样可以确保最后一个case的逻辑执行完毕后跳出switch-case语句。

对于警告中提到的控制到达非空函数末尾,这是因为在函数中使用了switch-case语句,而函数需要有返回值。如果在最后一个case中没有加上返回语句,那么函数执行完所有的case后没有返回值,这会导致编译器发出警告。

以下是一个示例代码,展示了如何正确使用switch-case语句并解决警告问题:

代码语言:txt
复制
#include <iostream>

int getValue(int num) {
    int result = 0;
    
    switch (num) {
        case 1:
            result = 10;
            break;
        case 2:
            result = 20;
            break;
        case 3:
            result = 30;
            break;
        default:
            result = -1;
            break;
    }
    
    return result;  // 加上返回语句
}

int main() {
    int num = 2;
    int value = getValue(num);
    std::cout << "Value: " << value << std::endl;
    
    return 0;
}

在这个示例代码中,我们定义了一个函数getValue,通过switch-case语句根据传入的参数num返回不同的值。每个case中都加上了跳出语句(break),并在最后一个case中加上了返回语句。这样可以确保代码的逻辑正确,并且不会出现警告"控制到达非空函数末尾"。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java程序设计的基本结构 - 选择结构

同时,博主也想通过此次尝试打造一个完善的技术图书馆,任何与文章技术点有关的异常、错误、注意事项均会在末尾列出,欢迎大家通过各种方式提供素材。 对于文章中出现的任何错误请大家批评指出,一定及时修改。...case进入执行,直到遇到break;为止 default关键字可以不出现,如果出现只能出现在最后的位置,在所有case都没有匹配时执行(如果离default最近的一个case没有使用break,则也可能会被执行...需要注意的是,if用小括号装一个条件,默认只能控制一条语句,如果需要控制多条语句需要使用大括号。...二、switch-case switch-case结构也是选择结构的一种,主要使用在选择条件较多,并且主要是等值判断时。...含有break和default 在这种情况下按次序进行判断执行匹配到的case后面的代码,执行完毕后直接结束switch-case结构,当所有的case都没有匹配时,执行default相关的代码。

65821
  • Java--Enum的思考

    枚举类与其行为无法很好的绑定 枚举类与行为绑定的操作一般使用switch-case来进行操作,这模式有缺点,比如增加了一个新的枚举常量,但是switch-case中没有增加,这是常有的事情,因为switch-case...break; case Plante.EARTH: // do something break; } } 枚举类 enum语法糖 枚举类实质上是一种语法糖,比如下面这个枚举...能够看出要点: 枚举类默认继承Enum,并且final类,所以自定义枚举类无法继承与被继承.但是可以实现接口 枚举字段是该枚举类的一个静态常量对象,且用数组存储. values实际上是调用clone方法,其创建新数组...构造函数前两个默认为枚举字段名称,以及所处的顺序.也就是Enum中的name与ordinal....那么为什么有很多公司禁止在二方库中返回值或者POJO使用枚举类呢?

    96740

    Java 中的决策(if、if-else、switch、break、continue、jump)

    在编程中也遇到一些情况,我们希望在满足某些条件时执行特定的代码块。  编程语言使用控制语句根据某些条件控制程序的执行流程。它们用于使执行流程根据程序状态的变化前进和分支。 ...Java的选择语句: if if-else nested-if if-else-if switch-case jump – break, continue, return 1. if:  if语句是最简单的决策语句...不允许出现重复的大小写值。 默认语句是可选的。 Break 语句在 switch 内部使用来终止语句序列。 如果没有break关键字,break语句是必需的,switch块中的语句失败。...实际上,这是一个刚刚经过循环体、到达循环末尾的 goto。continue 语句执行这样的操作。 ...也就是说,它使程序控制权转移回方法的调用者。

    36941

    LeetCode HOT 100 之总结记录

    可能算是第一次把回溯写出来,其实好像也不难 首先要搞清楚为什么需要回溯?...在这道题里面,如果指定输入数字的长度,其实是可以用循环的,但是并没有,所以你需要自行判断什么时候到达末尾,且在逐步到达末尾的过程中,你需要做一些操作来获得所要求的东西 回溯先是尝试一条路走到黑,然后退回一步...需要注意的就是特殊情况的判断,如两个node都为或者有一个node为一个不为;仍然需要注意整体性 /** * Definition for a binary tree node....只出现一次的数字 给定一个整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。...好几次都做不对的一个点:在初始化函数中,要this.arr=[],不要var arr=[] 要记住,栈顶是哪里 栈顶不是arr[0],是arr最末尾 226.

    35440

    SAX解析器创建自定义内容处理程序

    响应事件%XML.SAX.ContentHandle类分析XML文件,并在它到达XML文件中的特定点时生成事件。根据事件的不同,执行不同的方法。...默认情况下,这些方法是的,可以在自定义内容处理程序中覆盖它们。处理错误%XML.SAX.ContentHandler类在遇到某些错误时也执行方法: error() — 由可恢复的解析器错误触发。...warning() — 由解析器警告通知触发。默认情况下,这些方法为,可以在自定义内容处理程序中重写它们。...对于其他事件,例如到达End元素,不会发生任何事情(默认行为)。当ParseFile()方法到达文件末尾时,它返回。处理程序对象超出作用域,并自动从内存中删除。...%XML.SAX.Parser仅在以下情况下使用其自己的实体解析: PSSLConfiguration参数。已配置代理服务器。

    64520

    Python3 常见错误和异常处理

    所有的内建标准异常的基类 \ ArithmeticError 所有数值计算错误的基类 \ FloatingPointError 浮点计算错误 这个错误由导致错误的浮点操作产生,前提是已经打开了浮点异常控制...EOFError 没有内建输入,到达EOF 标记 对于类似input或者raw_input这样的内置函数,如果在遇到输入流末尾之前没有读到任何数据,产生 EnvironmentError 操作系统错误的基类...Unicode 相关的错误 ValueError的一个子类,出现Unicode问题时产生 UnicodeDecodeError Unicode 解码时的错误 \ UnicodeEncodeError...\ RuntimeWarning 可疑的运行时行为(runtime behavior)的警告 \ SyntaxWarning 可疑的语法的警告 \ UserWarning 用户代码生成的警告 \ Python3...'name'异常,获得附加的数据 else: #如果没有异常发生 以下为简单的try....except...else的语法: try: int("aaa") #可能出现异常的代码

    1.5K20

    关于eslint使用规则,和各种报错对应规则。

    , // 控制逗号前后的空格 "comma-spacing": [2, { "before": false, "after": true }], // 控制逗号在行尾出现还是在行首出现...也不能赋值给that以外的其他值 "consistent-this": 0, // 强制在子类构造函数中用super()调用父类构造函数,TypeScrip的编译器也提示..."no-empty-character-class": 2,//正则表达式中的[]内容不能为 "no-empty-label": 2,//禁止使用label "no-eq-null": 2,//禁止对..."no-with": 2,//禁用with "array-bracket-spacing": [2, "never"],//是否允许数组里面有多余的空格 "arrow-parens": 0,//箭头函数用小括号括起来...consistent-return": 0,//return 后面是否允许省略 "consistent-this": [2, "that"],//this别名 "constructor-super": 0,//派生类不能调用

    8.7K70

    关于eslint使用规则,和各种报错对应规则

    在用vue2.0写项目时,由于vue-cli脚 架自动带了带了代码规范监测,稍微不小心就会出现一些Warning,这时就需要,根据自己习惯的代码规范,用一下代码进行对Eslint规范的一些忽略。..., // 控制逗号前后的空格 "comma-spacing": [2, { "before": false, "after": true }], // 控制逗号在行尾出现还是在行首出现...也不能赋值给that以外的其他值 "consistent-this": 0, // 强制在子类构造函数中用super()调用父类构造函数,TypeScrip的编译器也提示..."no-empty-character-class": 2,//正则表达式中的[]内容不能为 "no-empty-label": 2,//禁止使用label "no-eq-null": 2,//禁止对..."no-with": 2,//禁用with "array-bracket-spacing": [2, "never"],//是否允许数组里面有多余的空格 "arrow-parens": 0,//箭头函数用小括号括起来

    3.8K50

    手把手教你如何优雅的使用Aop记录带参数的复杂Web接口日志

    但是大家应该也注意到了,一个接口日志,只记录因被其他玩家举报,警告玩家这样的信息没有任何意义。 记录日志的人倒不觉得,而最后去查看日志的人就要吾日三省吾身了,被谁举报了?因为什么举报了?我警告的谁?...新建参数类 新建一个类Param,其中包含所有在操作日志中,可能会出现的参数。为什么要这么做?...userId=748327843&name=testName 然后可以看到,控制台的输出如下。 因 工单号 [] /举报 ID [8] 警告玩家 [748327843] 并不会影响程序的正常运行。...因 工单号 [] /举报 ID [8] 警告玩家 [748327843], 游戏名 [tom], 年龄 [12] 然后就可以根据需求,将上面的日志记录到相应的地方。...因 工单号 [39424] /举报 ID [] 警告玩家 [748327843], 游戏名 [tom], 年龄 [12] 可以看到,id没有被获取到。

    2.1K10

    Kotlin 基础 | 拒绝语法噪音

    kotlin中类和方法默认是final的(可省略不写),这意味着默认情况下,类和方法是不允许被继承和重写的(这是为了防止脆弱的基类,即对基类方法的修改导致子类出现预期之外的行为)。...置于类型之后表示这个类型可,上面的函数声明表示此函数的返回值可能为null。 上面的 kotlin 代码为Person类添加了一个getCountry()方法,这种技术叫扩展函数 。...大多数情况下不需要显示指明变量类型,kotlin 具有类型推导能力,根据上下文自动推断类型。 fun保留字用于声明函数。...新建对象时不需要new,而是直接调用构造函数。 语句末尾不需要; 但加上也不会有语法错误。 kotlin 中类和方法默认是final的,他们不能被继承和重写。只有通过加上open后才能被继承和重写。...如果函数体由单个表达式构成,可以省去花括号和return。 when保留字用于取代switch-case,而且它是一个表达式,返回值是命中分支中最后一表达式的值。

    1.1K30

    代码中%80的逻辑性代码都可以被它发现

    即便是在运行时出现问题了,我们可能仍然需要费一番功夫才能最终找到代码的问题。幸运地是,我们可以利用一个工具在编译之前就可以发现这些问题。有了它,基本可以检查出代码中80%的逻辑性错误。...基本使用方法如下: lint-nt.exe -u files.lnt #执行之后扫描结果显示在控制台 其中files.lnt文件中的内容是需要扫描的源代码位置。...我们调用printf函数之后,并没有必要使用其返回值,因此我们可以忽略这个警告。 第24行提示警告号527,return语句不可到达。...,因为我们确认这不会对我们的程序本意造成任何影响,因此使用/*lint -e{534}*/屏蔽了main函数的534号警告。...为什么出现这样的结果? 如果将sum定义为全局静态变量,并且将循环条件改为loop < len,还会出现同样的结果吗?为什么

    1.6K40

    第117期:Dart的基本知识(变量的声明)

    我们可以通过在变量类型的末尾加一个问号(?)使其可为null。例如,int?可以是整数,也可以为null。如果我们知道表达式的计算结果从不为null,但Dart不允许这样,我们可以添加!...Dart支持顶级函数(如main()),以及绑定到类或对象的函数(分别为静态和实例方法)。还可以在函数(嵌套函数或局部函数)中创建函数。...Dart工具可以报告两种问题:警告和错误。警告只是表示代码可能无法工作,但它们不会阻止程序执行。错误可以是编译时或运行时。编译时错误会阻止代码执行;运行时错误导致代码执行时引发异常。...例如,以下代码是有效的,因为Dart可以在传递给print()时检测到lineCount为: int lineCount; if (weLikeToCount) { lineCount = countLines...通常,Dart的控制流分析可以在使用不可为的变量之前检测其何时设置为值,但有时分析失败。两种常见的情况是顶级变量和实例变量:Dart通常无法确定它们是否已设置,因此它不会尝试。

    93220

    谈谈C++新标准带来的属性(Attribute)

    按照C++语言标准,下列语言实体可以被属性所定义/并从中获益: 函数 变量 函数或者变量的名称 类型 程序块 Translation Unit (这个不知道用中文咋说) 程序控制声明 根据C++的标准提案...当然属性出现的位置和其修饰的对象是有一定关联的,属性仅在合适的位置才能产生效果。比如[[noreturn]必须出现函数定义的位置才会产生效果,如果出现在某个变量的声明处则无效。...所以在例子中的第一个函数func1才是正确的无返回函数的一个例子;而func2在参数值为false的情况下,它还是一个返回的函数。...,但是对于按值返回的调用没有警告。...如果类型中有一个类型,那么这个类的尺寸等于这个类型的大小。 如果类型中有一个类型和一个类型,那么尺寸一定大于类型尺寸,编译器还需要分配额外的地址给类型。

    62420
    领券