C-Primer-Plus-第二章-C语言概述

第二章 C语言概述

参考书籍:C Primer Plus(第6版)中文版

一、前言

打算跟这本书系统地学习一遍C语言,谨以此系列文章记录自己的学习之路。本文所有图片均来源于此书。

二、主要内容

1. C程序组成

C程序组成

2. C程序示例

#include <stdio.h>
int main(void)       /* 一个简单的C程序 */
{
    int num;        /* 定义一个名为num的变量 */
    num = 1;        /* 为num赋一个值 */
    
    printf("I am a simple");  //使用printf函数
    printf("computer.\n");
    printf("My favorite number is %d because it is first.\n",num);
    
    return 0;
}

2.1 快速概要

  • C程序包含一个或多个函数 ,它们是C程序的基本模块。
    • 程序中有一个名为main() 的函数。圆括号表明main() 是一个函数名。int 表明main() 函数返回一个整数,void 表明main() 不带任何参数。
    • intvoid 是标准ANSI C定义main() 的一部分。
  • 注释在/**/ 两个符号之间,这些注释能提高程序的可读性。
    • 注释只是为了帮助读者理解程序,编译器会忽略它们。
  • 该程序使用使用printf() 函数,在程序中使用函数叫作调用函数 。
  • 代码\n 告诉计算机另起一行,即把光标移至下一行。
  • %d 告诉计算机以何种形式输出num 的值,打印在何处
  • C函数可以给调用方提供(或返回)一个数,这里return语句的作用。

2.2 程序细节

  • #include指令和头文件
    • #include <stdio.h> 的作用相当于把stdio.h 文件中的所有内容都输入该行所在的位置。
    • 这是一种“拷贝-粘贴”的操作。include 文件提供了一种方便的途径共享许多程序共有的信息。
    • 所有的C编译器软件包都提供stdio.h 文件。该文件中包含了供编译器使用的输入和输出函数(如,printf())信息。该文件名的含义:standard input/output file
    • 通常,在C程序顶部的信息集合被称为头文件 (header)。头文件中可以定义一些常量,或者指明函数名以及如何使用它们。头文件包含了编译器创建最终可执行程序要用到的信息。
    • #include中的#符号表明,C预处理器在编译器接手之前处理这条指令,这属于预处理器指令
  • main()函数
    • C程序一定从main() 函数开始执行(目前不必考虑例外的情况)
    • 函数是C程序的基本模块
    • intmain() 函数的返回类型。这表明main() 函数返回的值是整数。返回到哪里?返回给操作系统。
    • 通常,函数名后面的圆括号中包含一些传入函数的信息。
  • 注释
    • 在程序中,被/* */ 两个符号括起来的部分是程序的注释。在/**/ 之间的内容都会被编译器忽略。
    • C99新增了另一种风格的注释,普遍用于C++和Java。这种新风格使用//符号创建注释,仅限于单行。
  • 花括号、函数体和块
    • 一般而言,所有的C函数都使用花括号标记函数体的开始和结束。
    • 花括号还可用于把函数中的多条语句合并为一个单元或块,类似于Pascal这些语言中的beginend
  • 声明
    • int num; 这行代码叫作声明 (declaration)。
    • 声明是C语言最重要的特性之一。
    • 在该例中,声明完成了两件事。
      • 其一,在函数中有一个名为num 的变量 (variable)。
      • 其二,int 表明num 是一个整数(integer)(即,没有小数点或小数部分的数)。
    • int 是C语言的一个关键字 (keyword),表示一种基本的C语言数据类型。
      • 关键字是语言定义的单词,不能做其他用途。
    • 示例中的num 是一个标识符 (identifier),也就是一个变量、函数或其他实体的名称。
      • 声明把特定标识符计算机内存中的特定位置联系起来,同时也确定了储存在某位置的信息类型或数据类型。
    • 在C语言中,所有变量都必须先声明才能使用。
    • 以前的C语言,还要求把变量声明在块的顶部,其他语句不能在任何声明的前面。C99和C11遵循C++的惯例,可以把声明放在块中的任何位置。
    • 数据类型
      • C语言可以处理多种类型的数据,如整数、字符和浮点数。
      • 把变量声明为整型或字符类型,计算机才能正确地储存、读取和解释数据。
    • 命名
      • 给变量命名时要使用有意义的变量名或标识符。
      • C99和C11允许使用更长的标识符名,但是编译器只识别前63个字符。
        • 如果两个标识符都是64个字符,只有最后一个字符不同,那么编译器可能将其视为同一个名称,也可能不会。标准并未定义在这种情况下会发生什么。
      • 可以用小写字母、大写字母、数字和下划线(_)来命名。而且,名称的第1个字符必须是字母或下划线,不能是数字。
      • C语言的名称区分大小写,即把一个字母的大写和小写视为两个不同的字符。因此,starsStarsSTARS 都不同。
  • 声明变量的4个理由
    • 把所有的变量放在一处,方便读者查找和理解程序的用途。
    • 声明变量会促使你在编写程序之前做一些计划。
      • 程序在开始时要获得哪些信息?希望程序如何输出?表示数据最好的方式是什么?
    • 声明变量有助于发现隐藏在程序中的小错误,如变量名拼写错误。
    • 如果事先未声明变量,C程序将无法通过编译
      • 在我地盘这 你就得听我的 把程序收割 用代码找快乐^ ^
  • 赋值
    • num = 1; 程序清单中的这行代码是赋值表达式语句。
    • 可以给num 赋不同的值,这就是num 之所以被称为变量 (variable)的原因
  • printf()函数
    • C语言的一个标准函数:printf()
    • 圆括号表明printf 是一个函数名。圆括号中的内容是从main() 函数传递给printf() 函数的信息。该信息被称为参数 ,或者更确切地说,是函数的实际参数 (actual argument)。
    • 在C语言中,实际参数(简称实参)是传递给函数的特定值,形式参数(简称形参)是函数中用于储存值的变量。
  • \n组合
    • \n 组合(依次输入这两个字符)代表一个换行符 (newline character)。
    • 换行符是一个转义序列 (escape sequence)。
      • 转义序列用于代表难以表示或无法输入的字符,如,\t 代表Tab 键,\b 代表Backspace 键(退格键)。每个转义序列都以反斜杠字符(\)开始。
  • %d占位符
    • % 提醒程序,要在该处打印一个变量,d 表明把变量作为十进制整数打印。
    • printf() 函数名中的f 提醒用户,这是一种格式化打印函数。
  • return语句
    • 有返回值的C函数要有return 语句。
    • int main(void) 中的int 表明main() 函数应返回一个整数。C标准要求main() 这样做。
    • 如果遗漏main() 函数中的return 语句,程序在运行至最外面的右花括号} 时会返回0

3. 简单程序的结构

C程序的基本结构:程序由一个或多个函数组成,必须有main() 函数。函数由函数头函数体组成。

  • 函数头 包括函数名、传入该函数的信息类型和函数的返回类型。
  • 函数体 被花括号括起来,由一系列语句、声明组成。
函数包含函数头和函数体

4. 提高程序可读性的技巧

  • 选择有意义的函数名和写注释。
    • 注意,使用这两种技巧时应相得益彰,避免重复啰嗦。如果变量名是width ,就不必写注释说明该变量表示宽度。
  • 在函数中用空行分隔概念上的多个部分。
    • C语言并未规定一定要使用空行,但是多使用空行能提高程序的可读性。
  • 每条语句各占一行。
    • C语言的格式比较自由,可以把多条语句放在一行,也可以每条语句独占一行。
    • 分号告诉编译器一条语句在哪里结束、下一条语句在哪里开始。

5. 多个函数

/*two_func.c -- 一个文件中包含两个函数*/
#include <stdio.h>
void butler(void); /* ANSI/ISO C函数原型 */
int main(void)
{
    printf("I will summon the butler function.\n");
    butler();
    printf("Yes. Bring me some tea and writeable DVDs.\n");
    
    return 0;
}
void butler(void)
{
    printf("You rang,sir?\n");
}

butler() 函数在程序中出现了3次。

  • 第1次是函数原型 (prototype),告知编译器在程序中要使用该函数。
    • 注意,void 在这里的意思是“空的”,而不是“无效”。
    • 例如,butler() 函数原型中的第1个void 表明,butler() 函数没有返回值。
  • 第2次以函数调用(function call)的形式出现在main() 中。
  • 第3次出现在函数定义(function definition)中,函数定义即是函数本身的源代码。
  • C90标准新增了函数原型。函数原型是一种声明形式,告知编译器正在使用某函数,因此函数原型也被称为函数声明 (function declaration)。
  • 记住,无论main()在程序文件处于什么位置,所有的C程序都从main()开始执行。但是,C的惯例是把main()放在开头,因为它提供了程序的基本框架。
  • C标准建议,要为程序中用到的所有函数提供函数原型。
    • 标准include文件(包含文件)为标准库函数提供了函数原型。例如,在C标准中,stdio.h文件包含了printf()的函数原型。

6. 调试程序

  • 语法错误
    • 如果不遵循C语言的规则就会犯语法错误 ,这类似于英文中的语法错误。
    • C语言的语法错误指的是,把有效的C符号放在错误的地方。
  • 语义错误
    • 编译器无法检测语义错误,因为这类错误并未违反C语言的规则。编译器无法了解你的真正意图,所以你只能自己找出这些错误。
    • 解决这类错误的方法之一是,把自己想象成计算机,跟着程序的步骤一步一步地执行。
  • 程序状态
    • 程序状态(program state)是在程序的执行过程中,某给定点上所有变量值的集合,它是计算机当前状态的一个快照。
    • 跟踪程序状态的方法
      • 自己模拟计算机逐步执行程序。
      • 在程序中的关键点插入额外的printf()语句,以监视制定变量值的变化。
      • 使用调试器,调试器(debugger)是一种程序,让你一步一步运行另一个程序,并检查该程序变量的值。

7. 关键字和保留标识符

关键字是C语言的词汇。它们对C而言比较特殊,不能用它们作为标识符(如,变量名)。许多关键字用于指定不同的类型,如int 。还有一些关键字(如,if )用于控制程序中语句的执行顺序。

在下表中所列的C语言关键字中,粗体表示的是C90标准新增的关键字,斜体 表示的C99标准新增的关键字,粗斜体 表示的是C11标准新增的关键字。

函数包含函数头和函数体

8. 关键概念

  • 程序员要具备抽象和逻辑的思维,并谨慎地处理细节问题。
  • 可以把程序看作是你希望计算机如何完成任务的描述。

9. 本章小结

  • C程序由一个或多个C函数组成。
    • 每个C程序必须包含一个main() 函数,这是C程序要调用的第1个函数。
  • 简单的函数由函数头和后面的一对花括号组成,花括号中是由声明、语句组成的函数体。
    • 声明语句为变量指定变量名,并标识该变量中储存的数据类型。
  • 编译器可以检测出语法错误,但是程序的语义错误只有编译完之后才能从程序的行为中表现出来。
    • 检查程序是否有语义错误要跟踪程序的状态,即检查程序每执行一步后所有变量的值。
  • 关键字是C语言的词汇。

10. 译者注

  • C语言是通过赋值运算符而不是赋值语句完成赋值操作。根据C标准,C语言并没有所谓的“赋值语句”,本书及一些其他书籍中提到的“赋值语句”实际上是表达式语句(C语言的6种基本语句之一)。本书把“赋值语句”均译为“赋值表达式语句”,以提醒初学者注意。
  • 在C语言中,return语句是一种跳转语句。
  • 历年的C标准中从来没有函数调用语句!值得一提的是,函数调用本身是一个表达式,圆括号是运算符,圆括号左边的函数名是运算对象。在C11标准中,这样的表达式是一种后缀表达式。在表达式末尾加上分号,就成了表达式语句。请初学者注意,这样的“函数调用语句”实质是表达式语句。
posted @ 2022-08-16 20:05  十豆加日月  阅读(116)  评论(0编辑  收藏  举报