0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C代码中的惊喜

刘勇 来源:阿兵888824 作者:阿兵888824 2022-07-15 08:17 次阅读

C 语言非常灵活且富有表现力;这些是它成功并能够被“更好”的语言取代的一些原因。其灵活性的一个例子是可以以多种功能等效的方式编写表达式。这使得编码风格能够适应个人需求。但是,有一个问题:有时,表面上等效的代码有细微的差别。这可以在最简单的代码中发生,我们将在本文中探讨一些可能性。

C 提供几种不同的方法来做某事是很常见的,所有这些方法都是完全等价的。例如,假设x是一个普通的int变量,以下每个语句都将执行完全相同的工作:

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

在每种情况下,都会将1添加到x。唯一可能的区别是,功能较弱的编译器可能会为最后两个选项生成稍微更好的代码(这暗示着获得更好的编译器是值得的)。

以这种方式使用的两种形式的++运算符产生相同的结果。但是,如果使用表达式的值,则前置增量和后置增量是不同的,因此:

y = x++; // y 在增量之前具有 x 的值 y = ++x; // y 在增量后具有 x 的值

有趣的是,后增量稍微“昂贵”一些,因为需要分配存储以保持x的旧值。但是,编译器可能会将其优化掉。如果在不使用表达式值时分配存储,那么肯定需要新的编译器!

如果x不是int,而是指向int的指针,则加1将具有加4的效果(在 32 位机器上)。如果这是一个很大的惊喜,那么重新学习指针算法是必要的。

然而,有时看起来等价的结构会有非常细微的差异……

在任何编程语言中,您可以做的最简单的事情可能就是为变量赋值。因此,在 C 语言中,我们可以这样写:

阿尔法 = 99; 贝塔 = 99; 伽玛 = 99;

当然,这可能会写得更紧凑,如下所示:

阿尔法 = 贝塔 = 伽马 = 99;

这些是 100% 等效的。还是他们?

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

首先,也是最平淡无奇的,每个变量都是独立的,也许一个注释说明为什么它被设置为这个值可能是合适的。

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

第三个原因与不合标准的编译器有关,它可能会为第一个构造生成如下代码:

mov r0, #99 移动阿尔法,r0 mov r0, #99 mov beta, r0 mov r0, #99 mov 伽马, r0

第二个构造暗示r0只需要加载一次。同样,更好的编译器不需要提示。

最后是执行顺序的问题。在第一个构造中,很明显 alpha 将首先分配,而 gamma 最后分配。编译器将这样解释第二个构造:

阿尔法 = (贝塔 = (伽马 = 99));

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

所以,我想说应该避免在一个语句结构中进行多个赋值。

总体而言,尽管 C 是一种小型语言,但可以说它可以通过提供更少的做事方式来变得更小。结果可能是更清晰、更易于维护的代码。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4752

    浏览量

    68360
  • 编译器
    +关注

    关注

    1

    文章

    1618

    浏览量

    49055
  • C代码
    +关注

    关注

    1

    文章

    89

    浏览量

    14289
收藏 人收藏

    评论

    相关推荐

    TMS320LF240x DSP的C语言和汇编代码快速入门

    电子发烧友网站提供《TMS320LF240x DSP的C语言和汇编代码快速入门.pdf》资料免费下载
    发表于 10-18 10:14 0次下载
    TMS320LF240x DSP的<b class='flag-5'>C</b>语言和汇编<b class='flag-5'>代码</b>快速入门

    如何通过I2C加载TPS2388x SRAM和奇偶校验代码

    电子发烧友网站提供《如何通过I2C加载TPS2388x SRAM和奇偶校验代码.pdf》资料免费下载
    发表于 09-06 11:16 0次下载
    如何通过I2<b class='flag-5'>C</b>加载TPS2388x SRAM和奇偶校验<b class='flag-5'>代码</b>

    hex文件如何查看原c语言代码

    是处理器可以直接执行的指令,而 C 语言代码则是人类可读的高级编程语言代码。 然而,如果你想要从 .hex 文件获取一些有用的信息或者对程序进行分析,你可以考虑以下几种方法: 反汇编
    的头像 发表于 09-02 10:37 1579次阅读

    技术干货驿站 ▏深入理解C语言:掌握常量,让你的代码更加稳固高效!

    C语言的世界,常量是一种不可忽视的元素。无论你是在编写简单的代码,还是构建复杂的系统,常量都能为你的程序带来更高的稳定性和可靠性。在这篇文章,我们将深入探讨
    的头像 发表于 08-29 13:59 2745次阅读
    技术干货驿站 ▏深入理解<b class='flag-5'>C</b>语言:掌握常量,让你的<b class='flag-5'>代码</b>更加稳固高效!

    C2000 DCSM ROM代码片段/ROP漏洞

    电子发烧友网站提供《C2000 DCSM ROM代码片段/ROP漏洞.pdf》资料免费下载
    发表于 08-28 09:39 0次下载
    <b class='flag-5'>C</b>2000 DCSM ROM<b class='flag-5'>代码</b>片段/ROP漏洞

    ModusToolbox 3.2在c代码包含c++代码的正确步骤是什么?

    使用 ModusToolbox 3.2 我有一个用纯 C 语言编写的 XMC4700 项目。 我正在尝试添加一些 C++ 函数,并将其合并到我的原始代码。 我可以构建独立的 .cpp
    发表于 07-23 08:21

    OpenCV图像识别C++代码

    的头文件 在您的C++代码,包含以下必要的头文件: # include # include # include # include # include # include # include 读取图像
    的头像 发表于 07-16 10:42 1813次阅读

    esp32使用http_server只能使用在main.c嵌入html代码吗?

    使用 http_server 只能使用在main.c嵌入html代码吗?可以使用html文件上传到一个目录访问?
    发表于 06-24 09:03

    esp32c3怎样保护flash代码不被拷贝?

    想知道这个c3怎样保护flash代码不被拷贝。这个内置flash代码有没有可能被拷贝出来,如果可以拷贝,应该怎样保护。 另一个问题
    发表于 06-19 06:32

    C/C++两种宏实现方式

    #ifndef的方式受C/C++语言标准支持。它不仅可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件(或者代码片段)不会被不小心同时包含。
    的头像 发表于 04-19 11:50 554次阅读

    C/C++代码动态测试工具VectorCAST插桩功能演示#代码动态测试 #C++

    C++代码
    北汇信息POLELINK
    发布于 :2024年04月18日 11:57:45

    KEIL MDK为什么无法debug library代码

    KEIL MDK 5.32及以下版本,都没法debug library代码,即使有c source文件也不能debug,怎么回事啊?
    发表于 04-10 06:20

    在数控编程,g代码的作用是什么

    在数控编程,G代码是一种用于控制数控机床运动和功能的编程语言。它是数控加工过程的重要组成部分,通过编写G代码,人们可以灵活地控制数控机床执行各种精密和复杂的操作,从而实现高精度、高
    的头像 发表于 02-14 15:53 1301次阅读

    BQ3588C_代码下载

    BQ3588C_代码下载
    的头像 发表于 01-10 15:09 491次阅读

    C语言代码的常用技巧

    #和##对于大部分C语言玩得还算比较溜的朋友并不是很陌生,不过能把这两个知识点游刃有余的应用到所在代码的每个角落,似乎并没有几个人能够做到,学的时候朗朗上口,而编码的时候却抛之脑后。
    的头像 发表于 12-05 09:25 527次阅读
    <b class='flag-5'>C</b>语言<b class='flag-5'>代码</b>的常用技巧