‘壹’ 使用Log4j时,为什么要写if
1)直接使用logger.info(“User”+userId) 来输出log,也能够达到log级别为info或在info以下时才输出:(“User”+userId),因为logger.info方法内部有判断输出级别的代码。但是在进入logger.info函数之前,(“User”+userId)这个表达式已经通过运算拼接成了一个字符串;而如果事先使用if(logger.isInfoEnabled())进行判断,那么当log级别在info以上时,就能省去上述的字符串操作,在高并发和复杂log信息拼接的情况下,使用这种标准的方法输出log能够省去不小的系统开销。另外,如果构造log信息的过程需要大量字符串操作,建议使用StringBuilder来完成字符串拼接。
2)error及其以上级别的log信息是一定会被输出的,所以只有logger.isDebugEnabled和logger.isInfoEnabled方法,而没有logger.isErrorEnabled方法。
‘贰’ 为什么很多程序员不用switch,而是大量的if……else if
答案:主要因为switch不适合业务系统的实际复杂需求,业务不断的变更迭代,一更改需求,条件的复杂度高了,switch无力处理。
switch优点
那么什么时候适合switch,它的场景是:基于单一变量的值(如枚举),这样的可读性比if条件更清晰。
switch缺点
从上面的场景来看,实在太局限,我来简单说一下它的一些缺点吧:
1. 现实的业务场景很复杂,条件不单一,一旦需求变更,维护代码相当崩溃。
2. switch经常忘记写break,估计很多人一不小心就忘记写了。如果你看过google的代码规范,你会发现,Google对switch的要求非常多。
switch的封装才更灵活
其实switch有人还在用也有一部分是 历史 原因,但是随着 科技 的发展,原有的设计以及落后了。
有些编程语言,如Python都没有switch这种语法。当然也有部分新语言Golang和Kotlin还是继承下来,但是又把switch包装了一下,去掉了令人误会的语法,这才让switch变得灵活起来了。 如果不封装,很难用。
IF语句的好处
通过上面描述的缺点也就是if语句更灵活的地方,根据业务进行逻辑条件编写,可维护性高。同时只要写的代码质量高,可读性也就会更高。
建议
现实的业务实际是很复杂的,我也不建议一定要用大量的if……else if,而是应该尽早返回来减少嵌套,这样增加了可读性以及降低维护的成本。
我个人觉得switch其实非常多余。
1 大部分场景,都是2到3个可能分支,用个if else就可以了,除非有4 个以上分支,太多else显得不好看,才考虑用switch.
2 switch限制多。switch必须是常量变量。if后面可以写任意表达式。
3用法复杂,case后面要么break,要么return,要是不写,居然还会继续执行剩下的分支,对于新手来说分分钟掉坑。
4 写法上其实也不比if else优雅简洁,switch xxx case xxxx ….
所以,switch徒增复杂性,真的不怎么实用。
如果有10000种switch的可能性,有1000000个值需要被处理,怕是你们说的这些个switch的好处就完全消失了,预期平均每次要比较5000次,1000000个值,总计要比较50亿次,不知道你们的CPU是啥主频能扛得住这个计算量,针对这种情况的终极武器还是hash,根据不同的语言,hash的value可以是匿名函数,可以是接口的不同实现,用hash来快速确定处理算法,而不是switch
作为程序员来说,我更喜欢switch的结构,更直观更容易找到相应的代码块。不过为什么很多程序员不用Switch,而是使用大量的if...else if的结构,甚至像Python已经不支持原生Switch语法了?
这个原因很简单,因为switch语法结构最后编译还是通过if...else if来完成代码的,所以从效率角度来说和if...else if一样的。但是switch对比条件比较单一,绝大多数支持switch的编程语言都支持等于比较,也就是说变量只能等于case中的条件才会执行代码块。但是现实情况中,对比条件绝大多数比单一等于运算要复杂得多,因此很多程序员就直接使用if...else if。但是if...else if的结构,后期维护起来会比较不清晰,毕竟没有Case...Break那么直观。但是添加一些注解应该还是能解决这个问题的。
所以,我现在能使用Switch的时候还是会使用switch,毕竟后期代码维护起来方便点。不过更多时候还是用if...else if。
switch只能用于简单判断,不支持表达式。
没有if else 使用方便。
从C/ C++来看,当分支较多且switch要比较的值是连续的话,执行速度远远远远快于if,因为switch是直接跳到目标代码执行的,而if则需要执行很多条语句,慢的不是一点点,一般编译器会根据分支数量和比较的值是否连续生成不同汇编代码,如果编译器判定不能提升速度的话,switch生成的汇编代码和if是一模一样的没有任何区别。
至于很多人不用switch我觉得可能是:
1.为了方便写代码,思维习惯随手就用if写了;
2.可能根本就不懂为什么要用switch吧。
相比之下Switch可以让人更宏观的去分析代码。编写代码和阅读代码需要宏观和微观两种视角,宏观看架构和数据走向,微观看语法和功能的片段。
有些朋友编码喜欢走一步看一步,越往后越发现前面留了好多坑需要后期再做进一步修正。有些朋友不把数据的分支想全面就会用很多if…else…来磊代码。
不是不想用Switch,只是因为编码时,太随性。所以想做专职的开发人员,对代码的宏观视角是必不可少的,并且编码时还要为今后的修改留有余地。
不是尽量别用,而是不合适没法用,合适得时候该用还是用。
比如说,变量i要求大于10,小于20,一条if(i>10&&i
‘叁’ 为什么要在else前加if
您好,很高兴回答您的问题。
else的英语单词表示的是否则的意思,也就是说在另一个已给出的条件基础上,对于不满足已知条件而给出的另一种结果。
在程序设计中,也是延续了这个单词的含义,把else作为关键字,表示不满足上面条件时而进行的操作。所以肯定要给出if表示给出的条件,然后若有不满足条件的,就用else来表示可以进行的操作。
‘肆’ C语言编程题
#include<stdio.h>
main()
{
int a=10,b=0;
if(a=12) /*这个地方将a赋值为12,取代原来的10*/
{a=a+1;b=b+1;} /*这个地方将a和b各加1*/
else /*没有执行*/
{a=a+4;b=b+4;} /*没有执行*/
printf("%d;%d\n",a,b);
}// 最后面输出a=13;b=1
--------------------------------
主要是弄错了 = 和 ==
= 是赋值
== 是才判断.
-----------------------------------------------
4.3 if 语句
if语句是C++/C语言中最简单、最常用的语句,然而很多程序员用隐含错误的方式写if语句。本节以“与零值比较”为例,展开讨论。
4.3.1 布尔变量与零值比较
l 【规则4-3-1】不可将布尔变量直接与TRUE、FALSE或者1、0进行比较。
根据布尔类型的语义,零值为“假”(记为FALSE),任何非零值都是“真”(记为TRUE)。TRUE的值究竟是什么并没有统一的标准。例如Visual C++ 将TRUE定义为1,而Visual Basic则将TRUE定义为-1。
假设布尔变量名字为flag,它与零值比较的标准if语句如下:
if (flag) // 表示flag为真
if (!flag) // 表示flag为假
其它的用法都属于不良风格,例如:
if (flag == TRUE)
if (flag == 1 )
if (flag == FALSE)
if (flag == 0)
4.3.2 整型变量与零值比较
l 【规则4-3-2】应当将整型变量用“==”或“!=”直接与0比较。
假设整型变量的名字为value,它与零值比较的标准if语句如下:
if (value == 0)
if (value != 0)
不可模仿布尔变量的风格而写成
if (value) // 会让人误解 value是布尔变量
if (!value)
4.3.3 浮点变量与零值比较
l 【规则4-3-3】不可将浮点变量用“==”或“!=”与任何数字比较。
千万要留意,无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。
假设浮点变量的名字为x,应当将
if (x == 0.0) // 隐含错误的比较
转化为
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON是允许的误差(即精度)。
4.3.4 指针变量与零值比较
l 【规则4-3-4】应当将指针变量用“==”或“!=”与NULL比较。
指针变量的零值是“空”(记为NULL)。尽管NULL的值与0相同,但是两者意义不同。假设指针变量的名字为p,它与零值比较的标准if语句如下:
if (p == NULL) // p与NULL显式比较,强调p是指针变量
if (p != NULL)
不要写成
if (p == 0) // 容易让人误解p是整型变量
if (p != 0)
或者
if (p) // 容易让人误解p是布尔变量
if (!p)
4.3.5 对if语句的补充说明
有时候我们可能会看到 if (NULL == p) 这样古怪的格式。不是程序写错了,是程序员为了防止将 if (p == NULL) 误写成 if (p = NULL),而有意把p和NULL颠倒。编译器认为 if (p = NULL) 是合法的,但是会指出 if (NULL = p)是错误的,因为NULL不能被赋值。
程序中有时会遇到if/else/return的组合,应该将如下不良风格的程序
if (condition)
return x;
return y;
改写为
if (condition)
{
return x;
}
else
{
return y;
}
或者改写成更加简练的
return (condition ? x : y);
‘伍’ 在c语言里,int num=1; if(num==2)与if(2==num)两个判断句哪个更好为什么还有更好的办法么
if(2==num)更好,像这样的判断一般有经验的程序员都会写if(常量==变量),因为这样写一旦写掉了一个“=”,在编译的时候就会检查出语法错误,编译无法通过,而写成if(变量==常量),即使写掉了一个“=”编译也会通过,没有语法错误,但是却是逻辑错误,在大程序中这种错误是很难检查出来的。