1.打印Hello World
1)编写程序:
#include <stdio.h> /* main: generate some simple output */ int main(void) { printf("Hello, world.\n"); return 0; }
2)将这个程序保存成main.c
,然后编译执行:
$ gcc main.c $ ./a.out Hello, world.
(备注:gcc
是Linux平台的C编译器,编译后在当前目录下生成可执行文件a.out
,直接在命令行输入这个可执行文件的路径就可以执行它)
3)如果不想把文件名叫a.out
,可以用gcc
的-o
参数自己指定文件名:
$ gcc main.c -o main $ ./main Hello, world.
2.程序分析
1)程序主体的int main(void){...return 0;}
结构,这些部分暂不详细解释,现只需把它们看成是程序按惯例必写的部分(Boilerplate)
2)注意main
是一个特殊的名字,C程序总是从main
里的第一条语句开始执行,在此程序中是指printf
语句
3)注释
/* ... */
结构是一个注释(Comment),其中可写一些描述性的话,解释这段程序在做什么。注释只是写给程序员看的,编译器忽略从/*
到*/
的所有字符,故写注释没语法规则,爱怎么写就怎么写,且不管写多少都不会被编译进可执行文件中
4)printf函数
printf
语句作用是把消息打印到屏幕。注意语句末尾以英文分号;(Semicolon)结束,下一条语句return 0;
也是如此
5){}括号
C语言用{}括号(Brace或Curly Brace)把语法结构分成组,在上面的程序中printf
和return
语句套在main
的{}括号中,表示它们属于main
的定义之中
6)缩进
printf
和return
语句相比main
那一行都缩进(Indent)了一些,在代码中可以用若干个空格(Blank)和Tab字符来缩进,缩进不是必须的,但它使我们更易看出这两行是属于main
的定义之中的,要写出漂亮的程序必须有整齐的缩进
7)错误提示(error)
编译器对语法错误毫不留情,若程序有一点拼写错误,如第一行写成了stdoi.h
,在编译时会得到错误提示:
(1)代码:
#include <stdoi.h> /* main: generate some simple output */ int main(void) { printf("Hello, world.\n"); return 0; }
(2)错误提示
$ gcc main.c main.c:1:19: error: stdoi.h: No such file or directory ...
意思是“在main.c
程序第1行第19列,错误,没有stdoi.h这样
的文件或目录”
8)警告(warning)
如把上例中的printf("Hello, world.\n");
改成printf(1);
然后编译运行:
(1)代码:
#include <stdio.h> /* main: generate some simple output */ int main(void) { printf(1); return 0; }
(2)警告信息:
$ gcc main.c main.c: In function ‘main’: main.c:7: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast $ ./a.out Segmentation fault
(1)警告信息是说”传递参数1的' printf '将指针从整数转换为不带强制转换的整数”,上面的程序运行时出了一个段错误,这属于运行时错误。
(2)警告信息不是致命错误,编译仍然可以继续,如果整个编译过程只有警告信息而没有错误信息,仍然可以生成可执行文件。
(3)警告信息不容忽视,出警告信息说明程序写得不够规范,可能有Bug,虽能编译生成可执行文件,但运行结果往往不正确
(4)各种警告信息严重程度不同,像上面的警告几乎一定表明程序中有Bug,而另外一些警告只表明程序写得不够规范,一般还能正确运行,有些不重要的警告信息gcc
默认是不提示的,但这些警告信息也有可能表明程序中有Bug
(5)好习惯:打开gcc的-Wall选项,也就是让gcc提示所有的警告信息,不管是严重的还是不严重的,然后把这些问题从代码中全部消灭
如把上例中的printf("Hello, world.\n");
改成printf(0);
代码:
#include <stdio.h> /* main: generate some simple output */ int main(void) { printf(0); return 0; }
然后编译运行:编译既不报错也不报警告,一切正常,但是运行程序什么也不打印
$ gcc main.c $ ./a.out
若打开-Wall
选项编译就会报警告了:
$ gcc -Wall main.c main.c: In function ‘main’: main.c:7: warning: null argument where non-null required (argument 1)
警告信息是”非空参数为空(参数1)”,若printf
中的0是你不小心写上去的(如错误使用了编辑器的查找替换功能),此警告就能帮你发现错误,强烈建议每一个编译命令时都加上-Wall
选项
总结:
尽管编译器的错误提示不够友好,但仍然是学习过程中一个很有用的工具,但反复练习,有了一定的经验积累之后面对编译器的错误提示就会从容得多了
眼过千遍,不如手过一遍