user-0 提问: switch case使用风格建议

回复:
user: user-1
content: 前面说的都挺好

user: user-2
content: 引用 9 楼 adusuccessfully 的回复:[quote=引用 4 楼 antuicang9886 的回复:] [quote=引用 1 楼 adusuccessfully 的回复:] 楼主贴的这段代码在前两个case中都没有对应的break语句： 若第一个case条件满足，则第一个case执行完，会继续执行第二个case，第三个case。   如果第一个case条件不满足，第二个case条件满足，程序会执行第二第三个case，这样容易造成程序混乱。  具体举例如下：  # include <stdio.h> int main(void) { 	int i = 1; 	switch(i) 	{ 		case 1: 			printf("%d",i); 		case 2: 			printf("%d",i+1); 		case 3: 			printf("%d",i+2); 			break; 		default: 			printf("%d",i+10); 			break; 	} }  上面程序i=1，第一个case条件满足，执行结果会输出：123 但如果每个case都加上break：  # include <stdio.h> int main(void) { 	int i = 1;  	switch(i) 	{ 		case 1: 			printf("%d",i); 			break; 		case 2: 			printf("%d",i+1); 			break; 		case 3: 			printf("%d",i+2); 			break; 		default: 			printf("%d",i+10); 			break; 	} }   执行结果只会输出：1  嘛，这个我也了解会输出123，在实际项目中，会出现下面的情况：  case 1： case 2：do somethingA();  break; case 3:   case 4:   do somethingB();   break;  按照《代码大全》的建议，应该是写成： case 1：do somethingA();  break; case 2：do somethingA();  break; case 3:  do somethingB();   break; case 4:  do somethingB();   break;  我的疑问其实更像是这类型问题，使用后者有什么更好的地方，甚至在组内讨论时，大家会前者更好，因为既然case1 与case 2做的事情一样，那么直接让它“穿越”还更省事，少写一些代码。 [/quote]  如果case1 2这两个条件做的事情相同，个人觉得放在一起会更好，case3 4的条件相同，也就放在一起。在实际的开发中，会常遇到这样的问题。[/quote] 同感, 因为是要做一样的事, 如果分开break的话在意义上就不同了, 就代表只是刚好用了一样的函数, 允许有不同的逻辑修改. 连着就代表一定是做一样的行为, 修改逻辑需慎重.

user: user-3
content: 引用 4 楼 antuicang9886 的回复:[quote=引用 1 楼 adusuccessfully 的回复:] 楼主贴的这段代码在前两个case中都没有对应的break语句： 若第一个case条件满足，则第一个case执行完，会继续执行第二个case，第三个case。   如果第一个case条件不满足，第二个case条件满足，程序会执行第二第三个case，这样容易造成程序混乱。  具体举例如下：  # include <stdio.h> int main(void) { 	int i = 1; 	switch(i) 	{ 		case 1: 			printf("%d",i); 		case 2: 			printf("%d",i+1); 		case 3: 			printf("%d",i+2); 			break; 		default: 			printf("%d",i+10); 			break; 	} }  上面程序i=1，第一个case条件满足，执行结果会输出：123 但如果每个case都加上break：  # include <stdio.h> int main(void) { 	int i = 1;  	switch(i) 	{ 		case 1: 			printf("%d",i); 			break; 		case 2: 			printf("%d",i+1); 			break; 		case 3: 			printf("%d",i+2); 			break; 		default: 			printf("%d",i+10); 			break; 	} }   执行结果只会输出：1  嘛，这个我也了解会输出123，在实际项目中，会出现下面的情况：  case 1： case 2：do somethingA();  break; case 3:   case 4:   do somethingB();   break;  按照《代码大全》的建议，应该是写成： case 1：do somethingA();  break; case 2：do somethingA();  break; case 3:  do somethingB();   break; case 4:  do somethingB();   break;  我的疑问其实更像是这类型问题，使用后者有什么更好的地方，甚至在组内讨论时，大家会前者更好，因为既然case1 与case 2做的事情一样，那么直接让它“穿越”还更省事，少写一些代码。 [/quote]  如果case1 2这两个条件做的事情相同，个人觉得放在一起会更好，case3 4的条件相同，也就放在一起。在实际的开发中，会常遇到这样的问题。

user: user-4
content: http://bbs.csdn.net/topics/380157851

user: user-5
content: 回到题目，如果某个时候想在case1分支后添加语句，如下这种写法 容易 忘掉 break，容易发生不想要的穿越 case 1：added codes; case 2：do somethingA();  break;  当然，也许有人会说，写的时候注意一下不就好了。 但毕竟人不是机器，会有疏忽的时候，按照代码大全的建议在这行有注释的话， 就会提醒修改代码的人，这行分支是什么目的，需不需要穿越。

user: user-5
content: 再举个例子，if分支下如果只有一行，也可以不用括号：  if ( a  == 5)    a = a+4;  但仍然建议加上括号，万一以后在printf（“a=5”）;后面再增加语句，就容易出错。  if ( a  == 5)    a = a+4;    a = a+8; //此行不属于if分支，可能和本来的意思不符合，容易出错。  如果有括号就能避免： if ( a  == 5)   ｛ a = a+4;        a = a+8; ｝  规范化的代码可维护性，可读性都会更好。

user: user-5
content: 按照代码大全的建议，以下写法也可以，但要在穿越分支需要给出明确的注释 case 1： //此行要给出明确的注释 case 2：do somethingA();  break; case 3:  //此行要给出明确的注释 case 4:   do somethingB();   break;  穿越代码在 修改 时可能会发生错误。建议的目的是提高可维护性。

user: user-0
content: 引用 1 楼 adusuccessfully 的回复:楼主贴的这段代码在前两个case中都没有对应的break语句： 若第一个case条件满足，则第一个case执行完，会继续执行第二个case，第三个case。   如果第一个case条件不满足，第二个case条件满足，程序会执行第二第三个case，这样容易造成程序混乱。  具体举例如下：  # include <stdio.h> int main(void) { 	int i = 1; 	switch(i) 	{ 		case 1: 			printf("%d",i); 		case 2: 			printf("%d",i+1); 		case 3: 			printf("%d",i+2); 			break; 		default: 			printf("%d",i+10); 			break; 	} }  上面程序i=1，第一个case条件满足，执行结果会输出：123 但如果每个case都加上break：  # include <stdio.h> int main(void) { 	int i = 1;  	switch(i) 	{ 		case 1: 			printf("%d",i); 			break; 		case 2: 			printf("%d",i+1); 			break; 		case 3: 			printf("%d",i+2); 			break; 		default: 			printf("%d",i+10); 			break; 	} }   执行结果只会输出：1  嘛，这个我也了解会输出123，在实际项目中，会出现下面的情况：  case 1： case 2：do somethingA();  break; case 3:   case 4:   do somethingB();   break;  按照《代码大全》的建议，应该是写成： case 1：do somethingA();  break; case 2：do somethingA();  break; case 3:  do somethingB();   break; case 4:  do somethingB();   break;  我的疑问其实更像是这类型问题，使用后者有什么更好的地方，甚至在组内讨论时，大家会前者更好，因为既然case1 与case 2做的事情一样，那么直接让它“穿越”还更省事，少写一些代码。

user: user-5
content: 解释得挺好。

user: user-3
content: 希望楼主不吝赏分啊，多谢多谢！

user: user-3
content: 楼主贴的这段代码在前两个case中都没有对应的break语句： 若第一个case条件满足，则第一个case执行完，会继续执行第二个case，第三个case。   如果第一个case条件不满足，第二个case条件满足，程序会执行第二第三个case，这样容易造成程序混乱。  具体举例如下：  # include <stdio.h> int main(void) { 	int i = 1; 	switch(i) 	{ 		case 1: 			printf("%d",i); 		case 2: 			printf("%d",i+1); 		case 3: 			printf("%d",i+2); 			break; 		default: 			printf("%d",i+10); 			break; 	} }  上面程序i=1，第一个case条件满足，执行结果会输出：123 但如果每个case都加上break：  # include <stdio.h> int main(void) { 	int i = 1;  	switch(i) 	{ 		case 1: 			printf("%d",i); 			break; 		case 2: 			printf("%d",i+1); 			break; 		case 3: 			printf("%d",i+2); 			break; 		default: 			printf("%d",i+10); 			break; 	} }   执行结果只会输出：1