C_Primer_Plus02.Introducing C

Introducing C

  • 要点

赋值符号 =
函数 main(), printf()
编写一个简单的C程序
创建整型变量,为其赋值并在屏幕上显示
换行字符
注释,含多个函数的程序,发现程序的错误
关键字

简单的C程序示例

#include <stdio.h>

int main(void){  /*comment*/
  int num;
  num = 1;  // another comment: assignment

  printf("I am a simple ");
  printf("computer.\n");
  printf("My favorite number is %d because it is first.\n", num);

  return 0;
}

程序运行时可能会在屏幕上一闪而过,因为程序会在运行结束后自动关闭窗口。
想让其运行完后保持不关闭,可以在 return 前添加一行代码,让其等待用户按下一个键后才关闭。
getchar();

逐行解释

#include <stdio.h>

预处理器指令,包含另一个文件。告诉编译器把 stdio.h 中的内容包含在当前程序中。

stdio.h: standard input/output, 是 C 编译器软件包的标准部分,提供键盘输入和屏幕输出的支持。

该行的作用是将 stdio.h 文件中所有内容都输入该行所在的位置。是一种“拷贝-黏贴” 的操作。

#include 这行代码是一条C预处理指令(preprocessor directive),通常,C编译器在编译前会对源代码做一些准备工作,即预处理(preprocessing).

所有的C编译器软件包都提供 stdio.h 文件。该文件中包含了供编译器使用的输入输出函数,它的含义是标准输入/输出头文件。通常C程序顶部的信息集合被称为头文件(header)。

大多数情况下,头文件包含了编译器创建最终可执行程序要用的信息。例如,头文件中可以定义一些常量,或者指明函数名以及如何使用它们。但是,函数的实际代码在一个预编译代码的库文件中。头文件帮助编译器把你的程序正确地组合在一起。

为何不内置输入输出:

并非所有程序都会用到 I/O 包。轻装上阵是C语言的哲学,这使得C语言成为流行的嵌入式编程语言。
#include 中的 # 表示C预处理器在编译器接手之前处理这条指令。

int main(void)

默认的程序入口。void 表示函数不带任何参数。改函数的返回值是返回给操作系统,第6章会详细介绍。

int main(void) 是标准写法,虽然有些编译器支持其他写法,但可能在移植时会出现问题。

intvoid 是 ANSI C 标准的 main 函数定义

变量名

  • 先定义后赋值和使用
    • 旧标准要求变量声明在块的顶部,其他语句不能再任何声明的前面
    • 新标准(C99,C11)遵循C++惯例,可以把声明放在块中的任何位置
    • 为了与旧系统更好地兼容,最好是把所有声明都放在块的顶部
    • 声明变量会把标识符与内存中的特定位置联系起来,同时也确定了存储在某位置的信息类型或数据类型,赋值时会将值存储在该位置
  • C99 和 C11 允许使用更长的标识符号,但编译器只识别前63个字符。对于外部标识符,只允许使用31个字符
    • 如果有两个字符名都是64长度,而只有最后一个字符不同,那么编译器认为这两个字符名是同一个
    • 变量可以使用大小写字母,数字,下划线,但首字符必须是字符或下划线,不能是数字
    • 操作系统和C库经常使用以一个或两个下划线字符开始的标识符,所以尽量避免在自己程序中使用这种名称,虽然没有语法错误,但是可能会导致名称冲突
    • C语言区分大小写
    • 为使C更加国际化,C99和C11根据通用字符名(UCN)机制添加了扩展字符集,其中包含了除英文字母以外的部分字符

为何需要声明变量

一些更古老的语言(Fortran,Basic等)都允许直接使用变量,不必事先声明,而C不采用这种方法,原因如下:

  • 把所有变量放在一起,方便读者查找和理解程序的用途。变量名要有意义,若变量名无法表述清楚,需要加注释,提高可读性
  • 声明变量会促使你在编写程序之前做一些计划:程序开始时要准备哪些信息、程序输出是什么、数据的表示方式是什么
  • 声明变量有助于发现隐藏在程序中的小错误

C99允许在需要时才声明变量,这样做的好处是:在给变量赋值之前声明变量,就不会忘记给变量赋值。但实际上目前仍有许多编译器还不支持C99。

printf() 函数

在屏幕上打印一串字符。光标会停留最后一个字符之后,同一行。

printf() 是标准的 C库函数。

实参:传递给函数的值
形参:函数中用于存储该值的变量

函数执行完后,控制权被返回至主调函数

return 0;

main 函数的返回值类型为 int,因此需要返回一个整数。main 函数中的 return 语句可以省略,那么程序运行至 main 函数的右花括号'}'时会返回0.但是最好要养成 main 函数中保留 return 语句的好习惯。

提高程序可读性的技巧

  • 选择有意义的函数名
  • 写注释
  • 函数中用空行分割概念上的多个部分
  • 每条语句各占一行

多个函数

//* two_func.c -- multi functions /
#include <stdio.h>
void butler(void);  /*ANSI/ISO C function prototype*/
int main(void){
  printf("Hello butler.\n");
  butler();
  print("GoodBye.\n");
}
void butler(void){  /*define function*/
  printf("Hello, I am butler.\n");
}

butler 函数第一次出现是函数原型(C90标准新增)。函数原型是一种声明形式,告知编译器程序要使用该函数,因此函数原型也被称为函数声明(function declaration)。函数原型还指明了函数的属性(输入输出值的属性),void表示没有输入/输出。

早期的C代码中的函数声明不需要指定参数类型。C90,C99和C11标准都承认旧版本,但也表明了会逐渐淘汰这种过时的写法。如果在编译时出现错误,需要把旧声明转换成函数原型。

何时执行函数是由 main 函数决定的,因此函数的位置不重要,可以在 main 之前,也可以在后面。但惯例是把 main 函数放在开头,其他函数放在后面。

C标准建议,要为程序中用到的所有函数提供函数原型。

关键字和保留标识符

粗体表示 C90 标准新增关键字,斜体表示 C99 标准新增关键字,粗斜体表示 C11 标准新增关键字:


这些关键字和保留标识符可能是有效的名称,不会引起语法错误,但也不要随便使用,否则可能会导致一些问题。保留标识符包括那些以下划线字符开头的标识符和标准库函数名。

posted @ 2019-09-05 22:46  keep-minding  阅读(97)  评论(0)    收藏  举报