1.2C语言基础知识 .3 表1.1.C语言关健字 auto break case char const(C90) continue default do double else enum(C90) extern float for goto if inline(C99)int long register restrict return short signed(C90) sizeof static struct switch typedef union unsigned void volatile (C90) while Alignas Alignof Bool _Complex_Generic _Imaginary _Noreturn _Static_assert #_Thread_local 1.2.2C语言数据类型 C语言的数据类型可分为基本数据类型和派生(扩展)数据类型。 ·基本数据类型:整型,实型,字符型(char)和布尔型(_Bool) (L)整型:int,short,long,unsigned int,unsigned short,unsigned long (2)实型:f1oat,doub1e 表1.2.C语言基本数据类型 数据类型|关键字 所占字节 」表示范围 整型 short 2 -215215-1 int 214 -215215-11-231231-1 long 418 -231~231-11-263263-1 unsigned short 2 |0~216-1 unsigned int 2/4 |0~216-1/0232-1 unsigned long 4/8 0~232-1/0~264-1 实型 float 4(6位有效数字)|10-38~1038 double 8(15位有效数字)10-308~10308 布尔型B0o1 1 0,1 字符型|char 凸注记:事实上,C语言标准没有规定年种数据类型的具体字节数和表示范国,只规定大小顺 序,即长度满足下面的关系式 char <short <int <long <long long 具体长度由编译器决定 ·派生(扩展、导出、自定义)数据类型:数组,指针,枚举,结构,联合,复数,等等 http://math.ecnu.edu.cn/-jypan(
1.2 C 语言基础知识 · 3 · 表 1.1. C 语言关键字 auto break case char const (C90) continue default do double else enum (C90) extern float for goto if inline (C99) int long register restrict return short signed (C90) sizeof static struct switch typedef union unsigned void volatile (C90) while _Alignas _Alignof _Bool _Complex _Generic _Imaginary _Noreturn _Static_assert #_Thread_local 1.2.2 C 语言数据类型 C 语言的数据类型可分为基本数据类型和派生(扩展)数据类型. • 基本数据类型: 整型, 实型, 字符型(char)和布尔型(_Bool) (1) 整型: int, short, long, unsigned int, unsigned short, unsigned long (2) 实型: float, double 表 1.2. C 语言基本数据类型 数据类型 关键字 所占字节 表示范围 整型 short 2 −2 15 ∼ 2 15 − 1 int 2 / 4 −2 15 ∼ 2 15 − 1 / −2 31 ∼ 2 31 − 1 long 4 / 8 −2 31 ∼ 2 31 − 1 / −2 63 ∼ 2 63 − 1 unsigned short 2 0 ∼ 2 16 − 1 unsigned int 2 / 4 0 ∼ 2 16 − 1 / 0 ∼ 2 32 − 1 unsigned long 4 / 8 0 ∼ 2 32 − 1 / 0 ∼ 2 64 − 1 实型 float 4 (6 位有效数字) 10−38 ∼ 1038 double 8 (15 位有效数字) 10−308 ∼ 10308 布尔型 _Bool 1 0, 1 字符型 char 1 b 注记:事实上, C 语言标准没有规定每种数据类型的具体字节数和表示范围, 只规定大小顺 序, 即长度满足下面的关系式 char <= short <= int <= long <= long long 具体长度由编译器决定. • 派生(扩展、导出、自定义)数据类型: 数组, 指针, 枚举, 结构, 联合, 复数, 等等 http://math.ecnu.edu.cn/~jypan
4 第一讲编程基础 整型 short,int,long signed,unsigned 实型 float,double 恭本数据类型 字符型 char 布尔型 Bool c99 数 数组 类型 派生米型 指针 扩展类型 结构与联合 复数 c99 空类型 void- 指针、函数 枚举型 enum ·为一个已有的数据类型另外命名:typedef typedef已有数据类型名新数据类型名 例1山给已有数据类型取别名 (C_datatype_typedef.c) #include <stdio.h> main() bool flag=1; real x=3.14; printf("flag-%d,x=%f\n",flag,x); f1ag=-1; 545673 rn1ag-d,XAn,f1ag,x刘 return 0; ·数据类型的转换 (1)自动转换/隐式转换: .相同张到的数据井行运竹时甘结里们姚是同数据类型.如3/)的结果是1: 不同类型的数据进行运算时,需要先转换成同一数据类型,然后再进行相应的运算 http://math.ecnu.edu.cn/-jypan
· 4 · 第一讲 编程基础 C 语 言 程 序 设 计 数 据 类 型 基本数据类型 整型 short,int,long 实型 float,double 字符型 char 布尔型 _Bool 派生类型 扩展类型 数组 指针 结构与联合 复数 空类型 void 枚举型 enum C99 指针、函数 signed,unsigned C99 • 为一个已有的数据类型另外命名: typedef ✞ ☎ typedef 已有数据类型名 新数据类型名 ✝ ✆ 例 1.1 给已有数据类型取别名. (C_datatype_typedef.c) 1 #include <stdio.h> 2 3 typedef _Bool bool; 4 typedef float real; 5 6 main() 7 { 8 bool flag=1; 9 real x=3.14; 10 11 printf("flag=%d, x=%f\n", flag, x); 12 13 flag=‐1; 14 x=2.78; 15 printf("flag=%d, x=%f\n", flag, x); 16 17 return 0; 18 } • 数据类型的转换 (1) 自动转换/隐式转换: 相同类型的数据进行运算时, 其结果仍然是同一数据类型, 如 3/2 的结果是 1; 不同类型的数据进行运算时, 需要先转换成同一数据类型, 然后再进行相应的运算; http://math.ecnu.edu.cn/~jypan
1.2C语言基础知识 .5 一转换按数据长度增加的方向进行,以尽可能地保证精度不会降低: ·所有的浮点运算都是以双精度进行的: 赋值号两边数据的类型不同时,需先将右边表达式的值转换为左边数据的类型,然后再赋 值: ,char型数据和short型数据进行运算时,需转换成int型: 字符变量直接参与算术运算时,先转化位相应的ASCI码,然后进行运算 char-->short-->int-->unsigned-->long --unsigned long-->double <--float (2)强制转换/显式转换 (类型标识符)表达式/将表达式的值转化为指定的数据类型 例1.2(类型转换)已知有下面的代码 x b/a; 11×=2.8 (①)由于a和b都是整型,因此表达式b/a的值也是整型,即b/a=2.将其赋值给doub1e型 变量x,因此x=2.0. (2)在计算(double)b/a时,先将b的值转化为doub1e型(注意,不是将b转化为doub1e 型,变量b的类型是不会改变的,然后与a相除.由于是一个double型的数据与一个 int型的数据进行运算,所以系统会自动将int型的数据转化为double型的数据,然 后再做运算.所以最后的结果是2.5. 3)在计算(doub1e)(b/a)时,是先计算b/a,然后将结果转化为doub1e型,所以最后的 结果是z=doub1e(2)=2.0 (④需要注意的是,变量a,b的类型在整个计算过程中是始终不变的,即一直是int型. 凸注记:类型转换是临时性的,类型转换不会改变变量本身的数据类型」 (⑤)类型转换规则: ·浮点型转整型:直接丢掉小数部分 ,字符型转整型:取字符的ASCI码 整型转字符型:ASC码对应的字符 1.23变量与常量 ·变量:存储数据,值可以改变 ()变量名:命名规则与标识符相同 (2)变量必须先声明,后使用:先赋值,后使用。 (3)变量声明: 类型标识符变量名列表 http://math.ecnu.edu.cn/-jypan
1.2 C 语言基础知识 · 5 · 转换按数据长度增加的方向进行, 以尽可能地保证精度不会降低; 所有的浮点运算都是以双精度进行的; 赋值号两边数据的类型不同时, 需先将右边表达式的值转换为左边数据的类型, 然后再赋 值; char 型数据和 short 型数据进行运算时, 需转换成 int 型; 字符变量直接参与算术运算时, 先转化位相应的 ASCII 码, 然后进行运算. char ‐‐> short ‐‐> int ‐‐> unsigned ‐‐> long ‐‐> unsigned long ‐‐> double <‐‐ float (2) 强制转换/显式转换 ✞ ☎ (类型标识符)表达式 // 将表达式的值转化为指定的数据类型 ✝ ✆ 例 1.2 (类型转换) 已知有下面的代码 1 int a=2, b=5; 2 double x, y, z; 3 4 x = b/a; // x = 2.0 5 y = (double)b/a; // y = 2.5 6 z = (double)(b/a); // z = 2.0 (1) 由于 a 和 b 都是整型, 因此表达式 b/a 的值也是整型, 即 b/a=2. 将其赋值给 double 型 变量 x, 因此 x=2.0. (2) 在计算 (double)b/a 时, 先将 b 的值转化为 double 型 (注意, 不是将 b 转化为 double 型, 变量 b 的类型是不会改变的!), 然后与 a 相除. 由于是一个 double 型的数据与一个 int 型的数据进行运算, 所以系统会自动将 int 型的数据转化为 double 型的数据, 然 后再做运算. 所以最后的结果是 2.5. (3) 在计算 (double)(b/a) 时, 是先计算 b/a, 然后将结果转化为 double 型, 所以最后的 结果是 z=double(2)=2.0 (4) 需要注意的是, 变量 a, b 的类型在整个计算过程中是始终不变的, 即一直是 int 型. b 注记:类型转换是临时性的, 类型转换不会改变变量本身的数据类型! (5) 类型转换规则: 浮点型转整型: 直接丢掉小数部分; 字符型转整型: 取字符的 ASCII 码; 整型转字符型: ASCII 码对应的字符. 1.2.3 变量与常量 • 变量: 存储数据, 值可以改变 (1) 变量名: 命名规则与标识符相同 (2) 变量必须先声明, 后使用; 先赋值, 后使用. (3) 变量声明: ✞ ☎ 类型标识符 变量名列表; ✝ ✆ http://math.ecnu.edu.cn/~jypan
.6 第一讲编程基础 可以同时声明多个变量,用逗号隔开 -变量声明时可以初始化 1 iti,j,k=0;/同时声明3个整型变量,但只对变量k进行初始化 double pi=3.14159: char c; ·常量(常数、字符串:在程序运行中值不能改变的量 ()整型常量:整数,后面加1或L表示长整型,后面加u或U表示无符号整型: (2)实型常量:缺省为双精度实数,后面加f或F表示单精度,加1或L表示1 ong double (③)字符型常量:用单引号括起来的单个字符和转义字符: (④字符串常量:用双引号括起来的字符序列: (5)布尔常量:true和false(需加头文件:#include<stdbool.h>) ·符号常量:用标识符表示常量 (1)声明方式 const类型标识符变量名=值; 1const float PI=3.1415926 (2)符号常量在声明时必须初始化 (③)符号常量的值在程序中不能被修改(即不能被重新赋值) ·枚举:定义新的数据类型 enUm枚举类型名{变量可取值列表,即枚举元素}; 1.2.4运算与表达式 ·运算符 ()算术运算符:+、-、*、/、%、+(自增)、-(自减) (2)就值运符:=、+=,-=。=、/=、%=、&=、|=、=、》》=、《《= (③)逗号运算符:,(把若干表达式组合成一个表达式) (④关系运算符:用于比较运算,>、<、=、>三、〈=、I= (5⑤)逻辑运算符:用于逻辑运算,&、1川、! (条件运算符:?:,是一个三目运算符,用于条件求值 (7)求字节数运算符:s1zeof(变量/数据/类型标识符) (⑧)位操作运算符:按二进制位进行运算,&、|、~、(异或)、<(佐移)、>(佑移) (9)指针运算符:*(取内容)、&(取地址) ·运算符优先级:(https:/en.cppreference.com/w/c/language/operator_precedence ·语句 (1)空语句(只有分号) (2)声明语句 (⑤)表达式语句: (④)复合语句(将多个语句用{}括起来组成的一个语句); (⑤)选择语句,循环语句,跳转语句: (6. http://math.ecnu.edu.cn/-jypan
· 6 · 第一讲 编程基础 可以同时声明多个变量, 用逗号隔开 变量声明时可以初始化 ✞ ☎ 1 int i, j, k=0; // 同时声明 3 个整型变量, 但只对变量 k 进行初始化 2 double pi=3.14159; 3 char c; ✝ ✆ • 常量 (常数、字符串): 在程序运行中值不能改变的量 (1) 整型常量: 整数, 后面加 l 或 L 表示长整型, 后面加 u 或 U 表示无符号整型; (2) 实型常量: 缺省为双精度实数, 后面加 f 或 F 表示单精度, 加 l 或 L 表示 long double (3) 字符型常量: 用单引号括起来的单个字符和转义字符; (4) 字符串常量: 用双引号括起来的字符序列; (5) 布尔常量: true 和 false (需加头文件: #include <stdbool.h>) • 符号常量: 用标识符表示常量 (1) 声明方式: ✞ ☎ const 类型标识符 变量名 = 值; ✝ ✆ ✞ ☎ 1 const float PI=3.1415926; ✝ ✆ (2) 符号常量在声明时必须初始化; (3) 符号常量的值在程序中不能被修改(即不能被重新赋值) • 枚举: 定义新的数据类型 ✞ ☎ enum 枚举类型名 {变量可取值列表, 即枚举元素}; ✝ ✆ 1.2.4 运算与表达式 • 运算符 (1) 算术运算符: +、‐、*、/、%、++ (自增)、‐‐ (自减) (2) 赋值运算符: =、+=、‐=、*=、/=、%= 、&=、|=、^=、>>=、<<= (3) 逗号运算符: , (把若干表达式组合成一个表达式) (4) 关系运算符: 用于比较运算, >、<、==、>=、<=、!= (5) 逻辑运算符: 用于逻辑运算, &&、||、! (6) 条件运算符: ? : , 是一个三目运算符, 用于条件求值 (7) 求字节数运算符: sizeof (变量/数据/类型标识符) (8) 位操作运算符: 按二进制位进行运算, &、|、~、^ (异或)、<< (左移)、>> (右移) (9) 指针运算符: * (取内容)、& (取地址) • 运算符优先级: (https://en.cppreference.com/w/c/language/operator_precedence) • 语句 (1) 空语句(只有分号) (2) 声明语句; (3) 表达式语句; (4) 复合语句(将多个语句用 { } 括起来组成的一个语句); (5) 选择语句, 循环语句, 跳转语句; (6) ... ... http://math.ecnu.edu.cn/~jypan
1.2C语言基础知识 .7 ·表达式:由运算符连接常量、变量、函数等所组成的式子: 。赋值语句 (①)标准赋值语句 变量=表达式; 13 2=y=3;∥等价于y=3;=y;这种赋值方式不能用于初始化 (2)自增自减:+,- ·前置:先自增或自减,然后参与表达式运算 ·后置:先参与表达式运算,然后自增或自减: -不要在同一语句中包含一个变量的多个+或-一,因为它们的解释在CC+标准中没有 规定,完全取决于编译器的个人行为.另外,也不要出现y=x+*x;以及类似的语句, 1 x+;/等价于x=x+1; +x;/川等价于X=x+1; y=X+*3;∥等价于y=3;=x+1;如果是yx4+*%,则结果怎样 4 y+x*3;∥等价于X=x+1;y=x*3 (3)复合赋值运算符:+=、=、*=、/=、%= 1 int x 2X4=3;1∥等价子X=x43到 3x3;11等价于x=x/3到 ·逗号运算符: 表达式1,表达式2 (1)先计算表达式1,再计算表达式2,并将表达式2的值作为整个表达式的结果 1int a=2,b; 2 a=35,a+10;1∥a=12or152 3b=(3*5,a+18);11b=? 山注记:为了避免由运算优先级所导致的低级错误,建议多使用小括号 ·位运算符:按二进制位进行运算 &、1、人(异或)、~(取反)、<(左移)、>》(右移) ·求字节数运算符 sizeof(变量) 川返回指定变量所占的字节数 S1zof(数据类型)/返回存储单个指定数据类型的数据所需的字节数 s1ze0f(表达式)返回存储表达式结果所需的字节数 http://math.ecnu.edu.cn/-jypan
1.2 C 语言基础知识 · 7 · • 表达式: 由运算符连接常量、变量、函数等所组成的式子; • 赋值语句 (1) 标准赋值语句 ✞ ☎ 变量=表达式; ✝ ✆ ✞ ☎ 1 x=3; 2 x=y=3; // 等价于 y=3; x=y; 这种赋值方式不能用于初始化 ✝ ✆ (2) 自增自减: ++, ‐‐ 前置: 先自增或自减, 然后参与表达式运算; 后置: 先参与表达式运算, 然后自增或自减; 不要在同一语句中包含一个变量的多个 ++ 或 ‐‐, 因为它们的解释在 C/C++ 标准中没有 规定, 完全取决于编译器的个人行为. 另外, 也不要出现 y=x++*x; 以及类似的语句. ✞ ☎ 1 x++; // 等价于 x=x+1; 2 ++x; // 等价于 x=x+1; 3 y=x++*3; // 等价于 y=x*3; x=x+1; 如果是 y=x++*x, 则结果怎样? 4 y=++x*3; // 等价于 x=x+1; y=x*3; ✝ ✆ (3) 复合赋值运算符: +=、‐=、*=、/=、%= ✞ ☎ 1 int x 2 x+=3; // 等价于 x=x+3; 3 x/=3; // 等价于 x=x/3; ✝ ✆ • 逗号运算符: ✞ ☎ 表达式1, 表达式2 ✝ ✆ (1) 先计算 表达式 1, 再计算 表达式 2, 并将 表达式 2 的值作为整个表达式的结果. ✞ ☎ 1 int a=2, b; 2 a = 3*5, a+10; // a=12 or 15? 3 b = (3*5, a+10); // b=? ✝ ✆ b 注记:为了避免由运算优先级所导致的低级错误, 建议多使用小括号. • 位运算符: 按二进制位进行运算 &、|、^ (异或)、~ (取反) 、<< (左移)、>> (右移) • 求字节数运算符: ✞ ☎ sizeof(变量) // 返回指定变量所占的字节数 sizeof(数据类型) // 返回存储单个指定数据类型的数据所需的字节数 sizeof(表达式) // 返回存储表达式结果所需的字节数 ✝ ✆ http://math.ecnu.edu.cn/~jypan