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)一个INTX是一个指针INT,加法1将具有(yǒu)增加的效果432位机器上)。如果这让您大吃一惊,那么有(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 alphar0

mov r0,#99

mov betar0

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ě)维护的代码。

 

请输入搜索关键字

确定