昨天,群里有小伙伴说他老师布置了作业,要求编写一个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语言应该有随时动手动脑的能力。