将多条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;
}

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

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


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

小结

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

阅读更多:   C语言
添加新评论

icon_redface.gificon_idea.gificon_cool.gif2016kuk.gificon_mrgreen.gif2016shuai.gif2016tp.gif2016db.gif2016ch.gificon_razz.gif2016zj.gificon_sad.gificon_cry.gif2016zhh.gificon_question.gif2016jk.gif2016bs.gificon_lol.gif2016qiao.gificon_surprised.gif2016fendou.gif2016ll.gif