C代码中的惊喜

文章:科林墙

C语言非常灵活和表现力;这些是原因,为什么它已经成功和有弹性被“更好”所取代......

C语言非常灵活和表现力;这些是原因,为什么它成功和有弹性被“更好”的语言所取代。其灵活性的一个例子是以多种功能等同的方式编写表达式的可能性。这使得编码风格适应个人需求。但是,有一个捕获量:有时,显然等效的代码具有细微差异。这可能发生在最简单的代码中,我们将探讨本文中的一些可能性。

对于C提供多种不同的方式来做一些不同的方式是常见的,这一切都是相同的。例如,鉴于这一点X是正常的int变量,下面的每个语句将做完全相同的工作:

x = x + 1;x + = 1;x ++;++ x;

在每种情况下1将被添加到X.唯一可能的区别是,能力较差的编译器可能为后两个选项生成稍好的代码(这意味着值得使用更好的编译器)。

这两种形式++操作员,以这种方式使用,产生相同的结果。但是,如果使用表达式的值,则预增量和递增后递增是不同的,因此:

y = x + +;// y在y = ++x之前有x的值;// y在递增后的值是x

有趣的是,增量稍微“昂贵”稍微“昂贵”,因为需要分配存储以保持旧值X.然而,编译器可能会对其进行优化。如果在表达式值未被使用时分配了存储空间,那么肯定需要一个新的编译器!

如果,而不是作为一个intX是一个指针int,加入1添加会有效果吗4.(在32位机器上)。如果这是一个大惊喜,一个复习一下指针运算在秩序。

但是,有时似乎等同物的构造具有非常细微的差异......

可能在任何编程语言中可以执行的最简单的事情是将值为变量的值分配。所以,在c中,我们可能会写:

alpha = 99;β= 99;伽玛= 99;

当然,这可能是如此紧凑地写入:

alpha = beta = gamma = 99;

这些是100%等价物。还是他们?

大多数情况下,这两种结构完全等同,但是(至少)选择一个或另一个时的四种情况可能会有所不同:

首先,最初的,每个变量都是分开的,也许是一个评论,指示它将其设置为此值的原因可能是合适的。

其次,写可维护代码总是好的。也许在将来的某些时候,可能需要更改代码,以便所有三个变量都不设置为相同的值。第一个格式更容易改变它们。

第三种原因涉及不合标准的编译器,这可能会为第一个构造生成这样的代码:

mov r0,#99movα,r0 mov r0,#99movβ,r0 mov r0,#99 mov gamma,r0

第二种构建给出了暗示r0只需要加载一次。同样,更好的编译器不需要提示。

最后,有执行订单问题。在第一个构造中,完全清楚,alpha将首先分配和伽玛。因此,编译器将解释第二种结构:

alpha =(beta =(gamma = 99));

这意味着赋值顺序颠倒了。但这有关系吗?大多数时候,它不会。但如果这些是设备寄存器,而不是普通变量,可能会有很大的不同。对于硬件来说,需要以精确的顺序加载设置值是非常常见的。

所以,我会说应该避免一个语句构造中的多个分配。

总的来说,虽然C是一种小语言,但可以争辩说,通过减少做事方式,它可能更小。结果可能是更清晰,更可维护的代码。

发表评论