c语言中break能跳出if语句吗,C语言 | 陷阱:一个Break在if语句中的误用

C语言以高效著称,但其也存在很多晦涩的语法。让我们来看下面这段(真实的)代码:

switch (cmd) {

case 0: break;

case 1:

if (bReceived == 1) {

if (bNotReady == 0) {

break; // 此处的break有误

}

do_something();

}

// 本意是满足条件跳出if, 不执行do_something()

do_otherthing();

break;

default:

break;

}// 却意外地跳出了switch, 从而没有执行do_otherthing()

以上代码的break意外跳出了case语句。之所以会产生这样的错误,是因为break在for和while中有类似的应用。我的这位朋友是在没有意识的情况下写出了上面这段代码。不仅如此,编译器(甚至高级的排错工具)对此也不会产生疑问,因为break在case语句之中是可以合法存在的。这里我用VS 2010测试了一下,如果该语句不在case语句下,编译器会提示break用法错误。

该错误可以通过将if的逻辑反转来解决:

switch (cmd) {

case 0: break;

case 1:

if (bReceived == 1) {

// 如果bNotReady == 0,将不执行do_something()

if (bNotReady != 0) {

do_something();

}

}

do_otherthing();

break;

default:

break;

}

【修订历史】

2015/12/02: V1.1 增加了对原代码的分析说明,增加了修改后的代码。

>> 本文章版权归作者所有,如需转载请联系作者授权许可。

>> 原文来自: 云飞机器人实验室

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值