辨析语言的微妙差异,使得语言精密的符合目的语义,此为程序员基本功的最高要求。对精密语义的追求,应当凌驾于排版美观,代码美感,代码简化之上,也凌驾于运行时效率之上。除非为特定目的小幅的修正,否则不应破坏此原则。

以此为指导,我们看几个if。

if a in python

以下代码的目标语义是,如果a不为None,就运行代码。

if a:
	do something

有什么问题?

有没有考虑a=0的情况?a=[]呢?

if a is not None:
	do something

这样才是严密表达。

if a in C

以下代码的目标语义是,a是一个int数,对a!=0的情况下,执行代码。

if (a) do something

有什么问题?

没问题,因为C是静态语言,这限定了a的使用。除了代码并没有体现a!=0的条件,没有太大问题。但是鉴于语言表达语义,最好改为以下代码。

if (a != 0)

相对的,如果a是bool型,就可以直接用了。

if (a)

如果a是char*形,那么合适的语义表达应当是。

if (a != NULL)

他们生成的汇编代码都没有差异。

if a in C++

概念上同C,不过a是一个复杂对象。

if (a) do something

有什么问题?

问题大了去了,和python一样,C++可以重载行为。谁知道type(a)::opreator bool(const type(a) &a)函数被定义为什么鬼逻辑。这就是为什么我憎恨默认行为重载的原因——因为他们对精密语义表达有破坏作用。