编程过程中,发现一些if…else写的很乱,需要整理,以下代码中A表示逻辑表达式1,B表示逻辑表达式2。一般情况下不会用A和B,但此处似乎用A和B更清晰,所以用A,B。
简单的与
int num = 0;
if(A){
if(B){
num = 5;
}
}
可转换为:
int num = 0;
if(A && B){
num = 5;
}
简单的或
int num = 0;
if(A){
num = 5;
}else if(B){
num = 5;
}
可转换为:
int num = 5;
if(A || B){
num = 5;
}
复杂变式:A和!A&&B设置相同
int num = 0;
if(A){
num = 5;
}else{
if(B){
num = 5;
}
}
合成步骤1:
int num = 0;
if(A){
num = 5;
}else if(B){
num = 5;
}
结果:
int num = 0;
if(A || B){
num = 5;
}
解析:
A||B含义:A成立时截断,不会判断B,A不成立时,判断B
验算表:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CN0YDM2IWZmVTN1czY4czYyYzX5IjN0kDM4AzLcdDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
复杂变式:A&&B和!A设置相同
int num = 0;
if(A){
if(B){
num = 5;
}
}else{
num = 5;
}
合成步骤1:
int num = 0;
if(!A){
num = 5;
}else{
if(B){
num = 5;
}
}
根据复杂变式:A和!A&&B设置相同带入上一个例子,可得:
if(!A||B){
}
不过这几种写法也不绝对要这样变,如果改变后的含义不容易理解,上面那个,我宁可这样写:
int b = 0;
if(A && B){
b = 5;
}else if(!A){
b = 5;
}
复杂变式:与非和非或(数学逻辑)
int b = 0;
if(!(A&&B)){
b = 5;
}
int b = 0;
if(!A || !B){
b = 5;
}
复杂变式:或非和非与(数学逻辑)
int b = 0;
if(!(A||B)){
b = 5;
}
int b = 0;
if(!A && !B){
b = 5;
}
这种修改,是以含义完整性为前提的,否则以后再去检查,看不懂就悲催了,呵呵。尤其是后面两种,因为基于数学逻辑,虽然逻辑没错,但可能一下变得很难理解,这样的话就没有必要修改。
我很讨厌多重嵌套,看起来很糟糕,于是强迫自己计算下,新的逻辑方式可以让代码变得更整洁。通过计算发现了这些规律,特此记录。
附:
(1)
if(A){
if(B){
}else{
}
}
if(A && B){
}else if(A
if(A){
checkB();
private void checkB(){
if(B){
}else{
}
}