【C语言深入】陷阱:一个Break在if语句中的误用

  版权信息:
● 本博客使用CC 3.0协议,转载请保留该信息。
● 原文作者: 戴晓天 @ 云飞机器人实验室
● 原文地址: 【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 增加了对原代码的分析说明,增加了修改后的代码。

%d bloggers like this: