14

将多条C语言语句写到一行,能够提升效率吗?

 3 years ago
source link: https://blog.popkx.com/%E5%B0%86%E5%A4%9A%E6%9D%A1c%E8%AF%AD%E8%A8%80%E8%AF%AD%E5%8F%A5%E5%86%99%E5%88%B0%E4%B8%80%E8%A1%8C-%E8%83%BD%E5%A4%9F%E6%8F%90%E5%8D%87%E6%95%88%E7%8E%87%E5%90%97/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

将多条C语言语句写到一行,能够提升效率吗?

发表于 2019-07-06 16:07:26   |   已被 访问: 480 次   |   分类于:   C语言   |   暂无评论

昨天,群里有小伙伴说他老师布置了作业,要求编写一个C语言函数,并在 main() 函数调用,输出以下内容:

asdasdasd
asdasd
asd
Hello world

于是小伙伴编写了他的C语言程序,但是编译并执行后,发现输出并不符合预期。于是,他将他编写的C语言代码发到群里,是下面这样的:

#include <stdio.h>

void letter(void)
{
    printf("asd");
}

int main()
{
    letter(), letter(), letter();
    letter(), letter();
    letter();

    printf("hello world!");

    return 0;
}
0e97805ef64c0eeb21abc24bab2a13d2.png

这并不是多难的问题,所以群里其他小伙伴很快就指出了问题所在,并给出了完成作业的参考思路。

C语言语句使用逗号隔开合法吗?

不过,这段C语言代码倒是引起了一点小小的讨论,讨论的焦点主要集中在这两行C语言代码的写法:

letter(), letter(), letter();
letter(), letter();

有小伙伴认为这两行代码不符合C语言语法,所以编译阶段就会报错。其实不是的,虽然这种写法并不是特别常见,但却是合法的,它与下面这种写法是相似的:

int a=0, b=1, c=2;

在C语言程序开发中,定义相同类型的变量时,为了简便,可以将多个变量写到同一行,并且对其赋值。事实上,我们编译小伙伴的C语言代码,是可以成功的,请看:

# gcc t.c 
# ./a.out 
asdasdasdasdasdasdhello world!#

可见,C语言是允许将多条语句用逗号隔开,写到同一行的。

将多条C语言语句写到一行,可以提升效率?

我们都知道,C语言程序是顺序执行的,也即按照代码顺序,“一行一行”地往下执行。既然如此,将 3 条语句写到同一行,是不是可以提升 3 倍效率呢?

乍一看,C语言程序每次执行“一行”,现在将本来的“三行”写成“一行”,也就是一次可以执行 3 条C语言语句了,看起来的确提升了效率。这种说法到底对不对呢?

其实不是的,C语言执行“一行”不同的语句,开销并不是始终相同的。其实仔细想想也应该能够明白,如果将多条C语言语句写到一行可以提升效率,那C语言代码何必还分行呢?干脆所有代码都写到一行就好了。

实际上,一行C语言代码可能会生成多条指令的,要搞清楚这一点,最好的办法就是查看汇编代码,我们输入 objdump 命令查看小伙伴的C语言代码对应的汇编代码:

# objdump -dS a.out
873819286d62906a4c04ea7dcf1efa00.png

从汇编代码可以看出,其实将 3 条 letter() 语句写到一行,和将 3 条 letter() 语句写到三行是等价的,并不会有效率差异。

可见,将多条C语言语句写到一行并没有什么特殊的,不会非法,也不会带来效率差异。如果一定要说这么做有什么坏处,也许让代码调试起来有些麻烦算一个。当然了,本文的分析只属于抛砖引玉(gcc version 4.8.4),学习C语言应该有随时动手动脑的能力。

阅读更多:   C语言


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK