24小(xiǎo)时联系電(diàn)话:18217114652、13661815404
中文(wén)
- 您当前的位置:
- 首页>
- 電(diàn)子资讯>
- 技术专题>
- C代码的惊喜
技术专题
C代码的惊喜
C语言非常灵活且富有(yǒu)表现力。这就是為(wèi)什么它成功并具有(yǒu)被“更好”的语言取代的弹性的一些原因。其灵活性的一个例子是可(kě)以用(yòng)功能(néng)上等效的多(duō)种方式来编写表达式。这样可(kě)以使编码样式适应个人需要。但是,有(yǒu)一个陷阱:有(yǒu)时,等效的代码有(yǒu)时会有(yǒu)细微的差别。这可(kě)能(néng)发生在最简单的代码中,我们将在本文(wén)中探讨一些可(kě)能(néng)性。
C通常提供几种不同的方法来做某事,所有(yǒu)这些方法都是完全等效的。例如,假设x是一个普通的int变量,则以下每个语句将执行完全相同的工作:
x = x + 1;
x + = 1;
x ++;
++ x;
在每种情况下,x将加1。唯一可(kě)能(néng)的區(qū)别是,能(néng)力较差的编译器可(kě)能(néng)会為(wèi)后两个选项生成稍微更好的代码(这暗示着获得更好的编译器值得)。
以这种方式使用(yòng)的两种形式的++运算符产生相同的结果。但是,如果使用(yòng)表达式的值,则前增量和后增量是不同的,因此:
y = x ++; // y在增量之前具有(yǒu)x的值
y = ++ x; // y的增量為(wèi)x
有(yǒu)趣的是,由于需要分(fēn)配存储空间以保持x的旧值,因此后增量稍微“贵”些。但是,编译器可(kě)能(néng)会对此进行优化。如果在不使用(yòng)表达式值的情况下分(fēn)配了存储空间,则肯定需要新(xīn)的编译器!
如果,代替作為(wèi)一个INT,X是一个指针INT,加法1将具有(yǒu)增加的效果4(32位机器上)。如果这让您大吃一惊,那么有(yǒu)必要对指针算法进行一些梳理(lǐ)。
但是,有(yǒu)时看似等效的构造有(yǒu)非常细微的差异……
在任何一种编程语言中,最简单的事情可(kě)能(néng)就是為(wèi)变量分(fēn)配一个值。因此,在C语言中,我们可(kě)以这样写:
阿尔法= 99;
Beta = 99;
伽玛= 99;
当然,可(kě)以这样写得更紧凑:
alpha = beta =伽马=
99;
这些都是100%等效的。还是他(tā)们?
在大多(duō)数情况下,这两种构造是完全等效的,但是(至少)在四种情况下选择其中一种可(kě)能(néng)会有(yǒu)所不同:
首先,在大多(duō)数情况下,每个变量都是独立的,也许有(yǒu)一条注释说明為(wèi)什么将其设置為(wèi)该值可(kě)能(néng)是适当的。
其次,编写可(kě)维护的代码总是好的。也许在将来的某个时候,可(kě)能(néng)需要更改代码,以使所有(yǒu)三个变量都不会设置為(wèi)相同的值。第一种格式更易于修改。
第三个原因与不合标准的编译器有(yǒu)关,后者可(kě)能(néng)会為(wèi)第一个构造生成如下代码:
mov r0,#99
mov alpha,r0
mov r0,#99
mov beta,r0
mov r0,#99
movγ,r0
第二种结构提示r0只需要加载一次。同样,更好的编译器将不需要提示。
最后,还有(yǒu)执行顺序的问题。在第一种构造中,完全清楚的是,将首先分(fēn)配alpha,最后分(fēn)配gamma。编译器将这样解释第二个构造:
alpha =(beta =(gamma = 99));
这意味着分(fēn)配顺序相反。但这有(yǒu)关系吗?大多(duō)数时候,它不是。但是,如果这些是设备寄存器,而不是普通变量,则可(kě)能(néng)会有(yǒu)很(hěn)大的不同。硬件需要以精确的顺序加载设置值是很(hěn)常见的。
因此,我要说的是,应避免在一个语句构造中进行多(duō)个分(fēn)配。
总體(tǐ)而言,尽管C是一门小(xiǎo)语言,但可(kě)以说通过减少操作方式,它甚至可(kě)以变得更小(xiǎo)。结果可(kě)能(néng)是更清晰,更可(kě)维护的代码。