1.什么是C语言
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
2.第一个C语言程序
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
C语言能够把执行某个特殊任务的指令和数据从程序的其余部分中分离出去,使其单独成为一个程序块,我们通常称之为函数,并取一个函数名。这些程序块就是函数体,独立的函数(程序块)可以在程序其余部分中用其函数名多次重复使用(函数调用)。
函数的定义由多个部分构成,其一般格式如下:
返回类型 函数名 (形参声明) //函数头
{
函数体; //一条或多条C语句
}
一般函数都会返回一个值(return后面跟随的值),这个返回值的数据类型就是函数的返回类型。也有一些函数没有返回值,只是执行一些具体的操作(比如打印输出等),这些没有返回值的函数在定义时其返回类型为 void 型。
main( ) 函数代码片段中的“int”是指 main( ) 函数返回值的类型是整数。计算机在运行程序时,正是通过检查 main( ) 函数的返回值来判断程序是否运行成功的。如果让 main( ) 函数返回整数 0,就表明程序运行成功,如果让它返回其他整数值,就表示程序在运行时出了问题。
- C语言是从主函数的第一行开始执行的,所以C语言代码中得有main函数——入口
- 一个工程中main函数有且仅有一个
- printf是C语言提供的库函数,用于在屏幕上打印信息
- 使用了库函数,就得引用头文件stdio.h
3.数据类型
C语言程序中有 3 种数据:
一种是数字,例如,0、100、-123、1.23、3.14159、-99.9等;
一种是字符,例如,‘A’、‘z’、‘5’、‘0’、‘+’、‘*’、‘%’、‘真’、‘假’、‘大’;
还有一种是字符串,例如,“ABC”、“china”、“C语言”、“main”、“12+3”。
C语言中的字符(character)是计算机能够表示的任意一个字符,并且必须用’ '(单引号)括起来。
C语言中的字符串(string)是多个字符的组合,必须用" "(双引号)括起来。
不同的数据在计算机中的处理方式(输入、输出及存储)是不一样的,因而在计算机编程中通常把需要处理的数据根据其处理方式的不同分为不同的组,我们把这样的分组称为数据类型。
C语言中最常用的数据类型有 3 种。
- 整型:处理整数值(不含小数位)的数据类型。例如:0、1、100、9999、-123。
- 浮点型(实型):处理浮点值(含小数位)的数据类型。例如:1.23、3.14159、-99.9。
- 字符型:处理一个字符的数据类型。例如:‘A’、‘z’、‘5’、‘0’、‘+’、‘*’、‘%’、‘真’、‘假’。
下表列出了 C语言中常用数据类型的取值范围和占用内存的字节数。
类型名(C语言命令符) | 说明 | 字节 | 取值范围 |
---|---|---|---|
char | 字符型 | 1 | 其十进制代码范围为 -128~127 的 256 个字符 |
int | 整型 | 2 | -32768~32768(-215 ~215-1) |
long int | 长整型 | 4 | -2147483648~21474883647(-231 ~231-1) |
float | 单精度浮点型 | 4 | +3.4 ×1038(小数点后 6~7 位有效数字) |
double | 双精度浮点型 | 8 | +1.7×10308(小数点后 6~7 位有效数)n2 |
- 1字节(byte)=8比特(bit)
- 存在这么多的类型,其实是为了更加丰富的表达生活中的各种值。
4.变量常量
生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等),有些值是可变的(比如:年龄,体重,薪资)。
不变的值,C语言中用常量的概念来表示,变的值C语言中用变量来表示。
4.1定义变量的方法
C语言中的变量在使用之前必须先定义。定义变量时,我们要给变量取一个独一无二的名字,同时还要说明该变量中可以存放“什么数据类型的数据(值)”。也就是说,一个变量中只能存放一种与其相同类型的数据(值)。定义为存放整型数据的变量中是不能代入一个字符(字符型)或者小数(浮点型)的。
#include <stdio.h>
int main()
{
int myScore,id; //定义两个整形变量
long int distance=1800000; //定义长整型变量并代入初始值
char myName='方',job='Q'; //定义两个字符型变量并代入初始值
float average=86.5; //定义单精度浮点型变量并代入初始值
double pi=3.1415926536; //定义双精度浮点型变量并代入初始值
}
4.2变量命名规则
变量是通过变量名区分的,所以每个变量都应该取一个与众不同的名字。在 C语言中,给变量取名有一些特殊的规定(命名规则)。
- 不可以数字开头
- 不可包含特殊字符
- 不可用保留字
- 不可使用相同的名字
在 C语言中,有一些字(英文单词)具有特定的含义(在 C语言的某个命令符中使用了等等),不能用于其他用途,也就不能用它来做变量的名字。我们称这些特殊的字为C语言的保留字,下表中列出了标准 C语言中所定义的保留字。
auto | double | int | struct |
---|---|---|---|
break | else | long | switch |
case | enum | register | typedef |
char | extern | return | union |
const | float | short | unsigned |
continue | for | signed | void |
default | goto | sizeof | volatile |
do | if | static | while |
除了保留字之外,C语言中还有许多字符串与保留字类似,比如 printf 和 scanf 是 C语言标准函数库中的函数名称,我们也不能用它来做变量的名字。像这些在 C语言标准函数库中已经定义并使用过的字符串我们称为 C语言的标准标识符。
除了标准标识符外,C语言允许用户自定义一些名称,比如给变量命名或者给用户自定义的函数命名等,这些由用户自定义的名称我们称为用户标识符。最常见的用户标识符就是变量名。
下面这些都是不合法的变量名:
- 86Count(不合法原因:以数字开头)
- my name(不合法原因:包含空格)
- user's(不合法原因:包含特殊字符‘)
- int(不合法原因:C语言保留字)
另外,C语言中是严格区分大写字母与小写字母的。比如 do 是保留字,而 Do、DO、dO 就不是,因而它们三个可以用作变量名。通常情况下,C语言中的所有保留字、标准库函数名和普通标识符都只用小写字母表示,而常量名则通常用大写字母表示。
4.3变量的分类
C语言中的变量分为局部变量和全局变量。
局部变量又称内部变量,由某对象或某个函数所创建的变量通常都是局部变量,只能被内部引用,而无法被其它对象或函数引用。
全局变量即外部变量,创建在函数的外部的变量,可以创建在程序中的任何位置。全部变量是可以被本程序中的任何函数或对象调用的。若一个局部变量被其他对象调用,会是一个空值,而全局变量则不会出现这中情况。
#include <stdio.h>
int global = 2022;//全局变量
int main()
{
int local = 2020;//局部变量
//下面定义的global会不会有问题?
int global = 2021;//局部变量
printf("global = %d\n", global);
return 0; }
- 上面的局部变量global变量的定义其实没有什么问题的!
- 当全局变变量和局部变量重名时起作用的将是局部变量。
4.4变量的作用域和生命周期
要创建大规模的C语言程序,必须首先理解程序中变量的作用域和生命周期。
4.4.1作用域
变量的作用域是指一个变量在程序中起作用的区域,一般可以理解为变量所在的{ }的包围区域。
在程序块(一个{ }内)中声明的变量(一般称为局部变量),只在该程序块{ }中起作用。也就是说,一个变量从被声明的位置开始,到包含该变量声明的程序块最后的大括号为止,这一区间内是起作用的。这样的作用域称为块作用域。
而在 C 程序的 main( ) 函数以及其他自定义函数外面的程序开始部分声明的变量(一般称为全局变量),从声明位置开始,到该程序的结尾都是起作用的。这样的作用域称为文件作用域。
- 局部变量的作用域是变量所在的局部范围。
- 全局变量的作用域是整个工程。
4.4.2生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。
- 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
- 全局变量的生命周期是:整个程序的生命周期。
4.5常量
C语言中的常量和变量的定义的形式有所差异。
C语言中的常量分为以下以下几种:
- 字面常量
- const 修饰的常变量
- #define 定义的标识符常量
- 枚举常量
#include <stdio.h>
//举例
enum Sex
{
MALE,
FEMALE,
SECRET
};
//括号中的MALE,FEMALE,SECRET是枚举常量
int main()
{
//字面常量演示
3.14;//字面常量
1000;//字面常量
//const 修饰的常变量
const float pai = 3.14f; //这里的pai是const修饰的常变量
pai = 5.14;//是不能直接修改的!
//#define的标识符常量 演示
#define MAX 100
printf("max = %d\n", MAX);
//枚举常量演示
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
//注:枚举常量的默认是从0开始,依次向下递增1的
return 0;
}
- 上面例子上的 pai 被称为 const 修饰的常变量, const 修饰的常变量在C语言中只是在语法层面限制了
- 变量 pai 不能直接被改变,但是 pai 本质上还是一个变量的,所以叫常变量。
5.C语言输入输出
C语言的输入和输出是用户和计算机之间的交互方式,其中有两个函数最常用,分别是 scanf() 和 printf():
- scanf() 是格式输入函数,按用户指定的格式从键盘上把数据输入到指定变量中;
- printf() 是格式化输出函数,主要功能是向标准输出设备按规定格式输出信息。
5.1 printf()和puts()的简单使用
程序在计算机的内存中运行,得出结果以后总是需要输出,这样我们才能查看程序的运行状况。C语言用于输出的主要方法是使用格式输出函数 printf( ) 和字符串输出函数 puts( )。
printf( ) 函数的作用就是把字符、数字和单词发送到电脑屏幕上(屏幕打印)。
printf( )的一般格式如下:
printf("格式控制字符串",输出表列); //输出表列各项用符号,分隔开
puts( )函数是把字符串输出到电脑屏幕上并换行。
puts("Hello World!");