1.5 别把分号放错地方

分号“;”并不总是出现在语句的尾部。如下的写法


#include <stdio.h>
;
  

虽然可以通过编译并能正确运行,但会出现如下警告信息:


warning C4067
: unexpected tokens following preprocessor directive - expected a newline
  

C语言标准规定一行可以有多条语句,例如:


int a
; double d
; char c
;
  

但输入输出不是C语言的一部分,而是以标准函数形式提供。在每个引用库函数的源程序文件的开头处必须含有如下一行。


#include <stdio.h> 
  

文件stdio.h定义了I/O库所用的某些宏和变量,使用#include语句把它包含进来,一起编译。虽然有的C编译器使用scanf和printf函数不需要包含它,但建议养成使用这条语句的习惯。其实,一条预编译语句是以换行作为结束的,也就是说,一行只能书写一条预编译语句,如果书写两条,也会给出如上警告。

包含语句属于预编译语句,“;”号作为语句结束符用在一条程序语句之后,而包含语句不是程序语句,它不是以“;”号作为结束符。这里多出一个符号,编译系统认为你应该从“;”号处换行,以便保证预编译语句正确,所以给出警告信息。这与语句漏掉“;”号不同,如果语句尾部漏掉“;”号,就不是给出警告信息,而是给出出错信息。例如:


printf
("
输入x
:"
)
scanf
("%Lf"
,&x
);
  

会给出如下出错信息:


error C2146
: syntax error 
: missing '
;' before identifier 'scanf'
  

这条信息明确指出在scanf语句之前漏掉分号,也就是printf少了语句结束符“;”。

如果程序中多用了“;”号,则“;”号构成跳空语句,即


printf
("
输入x
:"
);;
  

相当于


printf
("
输入x
:"
);
;
  

两条语句,第2行的“;”语句什么也不做。

由此可知,包含头文件的语句没有“;”号,其他语句必须以“;”结束。当然,主函数不是语句,它的“)”号之后更不能有分号。

关于函数和判别语句,暂不讨论。对于入门,目前掌握这些就足够了。

《C语言解惑》