C语言基本语法1(20210925)
-
关键字
auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while
-
标识符
- 由字母、数字、下划线组成
- 第一个字符必须是字母或下划线
- 区分大小写
-
常量
-
整数常量
-
八进制–第一个数字是0
-
十六进制–以0x或者0X开头
-
常量后面加符号l或者L–long int类型
-
常量后面加符号u或者U–undesigned int类型
-
-
浮点数常量
- 浮点常数+e+符号+整数–科学计数法
-
字符常量
常见特殊字符及其含义 \a 声音警铃 \b 退格 \f 表单 \n 换行 \r 回车 \t 水平制表 \v 垂直制表 \\ \" \' \? 对应原符号
-
字符串常量
-
-
运算符与表达式
-
运算符的优先级及结合方式
优先级 运算符/名称 特征 结合方向 1 ()圆括号 []下标 ->指针引用结构体成员 .取结构体变量成员 初等运算符 从左到右 2 !逻辑非 ~按位取反 +正号 -负号 单目运算(只有一个操作数) 从右到左 3 (类型名)类型强制转换 *取指针内容 &取地址 ++自增 --自减 sizeof长度运算符 单目运算(只有一个操作数) 从右到左 4 *相乘 /相除 %取两整数相除的余数 算数运算 从左到右 5 +相加 -相减 算数运算 从左到右 6 <<左移 >>右移 移位运算 从左到右 7 >大于 <小于 >=大于或等于 <=小于或等于 关系运算 从左到右 8 ==等于 !=不等于 从左到右 9 &按位“与” 位逻辑运算 从左到右 10 ^按位“异或” 位逻辑运算 从左到右 11 &&逻辑“与” 逻辑运算 从左到右 12 ||逻辑“或” 逻辑运算 从左到右 13 ?:条件运算 三目运算 从右到左 14 = += -= *= /= %= &= ……= |= >>= <<= 赋值运算 从右到左 15 ,逗号运算 从左到右 - 优先级1最高,优先级15最低
-
算术表达式
-
自增自减表达式
假设v是一个可修改的变量
++v
:先把v的值加1,然后将v的值做为表达式的值v++
:先把v的值做为表达式的值,然后将v的值加1--v
: 先把v的值减1,然后将v的值做为表达式的值v--
: 先把v的值做为表达式的值,然后将v的值减1
-
逻辑表达式
假设a,b是除了void类型外的任何基本数据类型,或者两者都是指针类型
-
a && b
:当a和b的值都不为0时结果为1,否则结果为0(只有a不等于0时才对b求值) -
a \|\|b
:当a和b中有一个不为0时结果为1,否则结果为0(只有a等于0时才对b求值) -
!a
:当a等于0时结果为1,否则结果为0
-
-
关系表达式
假设a,b是除了void类型外的任何基本数据类型,或者两者都是指针类型(a和b需要指向同一个数组或者同一个结构或联合的成员)
a<b a<=b a>b a>=b a==b a!=b
- 条件成立时结果为1,否则结果为0
-
字位表达式
假设i、j、n都是整型表达式
i&j
:i和j执行按位与操作i\|j
:i和j执行按位或操作i^j
:i和j执行按位异或操作~i
:i的补数i<<n
:i左移n位i>>n
:i右移n位
-
强制类型转换表达式
假设type是一种数据类型,a是一个表达式
type(a)
:将a转换为指定的类型
-
逗号表达式
假设a、b分别是两个表达式
a, b
:编译器先对a求值,然后再对b求值,表达式的结果和类型等于表达式b的结果和类型 -
赋值表达式
假设v是一个可修改的变量,op是一个有对应赋值操作符的操作符,a是一个表达式
v = a
:把a的值保存到v中v op= a
:表示把op代表的操作作用于v和a,然后将结果保存到v中,相当于v=v op a
-
条件表达式
假设a、b、c是表达式
a?b:c
:当a的值不为0的时候,表达式等于b,否则等于c(只对b或者c中的一个求值)
-
sizeof运算符
假设type是一种数据类型,a是一个表达式
sizeof(type)
:表达式的值等于容纳指定数据类型的值所需要的内存字节数sizeof(a)
:表达式的值等于保存表达式a的结果所需要的内存字节数
-
数组的基本操作
假设a为含有n个元素的数组;i为整型数的表达式;v为表达式
a[0]
:数组a的第一个元素a[n-1]
:数组a的最后一个元素a[i]
:数组的第i+1个元素a[i]=v
:把表达式v的结果值保存到a[i]中
-
结构的基本操作
①x:是一个可以修改的变量,其类型为struct s ;②y:是一个类型为struct s的表达式 ;
③m:是类型struct s的一个成员变量的名字 ; ④v:是一个表达式
x
:引用整个结构,其类型为struct sy.m
:引用结构变量y的成员变量m,其类型为m的类型x.m = v
:将表达式v的值保存到结构变量x的成员变量m中,其类型为m的函数x = y
:将y的值赋给x,结果类型为struct sf(y)
:调用函数f()并将结果变量y的内容作为参数传递给该函数。在函数f()内部,形式参数的类型必须是struct sreturn y
:返回结构变量y的内容,函数的返回值必须被声明为struct s类型
-
指针的基本操作
①x:是一个类型为t的变量 ; ②pt:是一个指向t类型变量的指针变量 ; ③v:是一个表达式
&x
:生成一个指向x的指针,表达式的类型为指向t的指针pt = &x
:使得指针pt指向x,表达式的类型为指向t类型变量的指针pt = NULL
:将指针pt设置为空指针pt == NULL
:判断pt是否为空指针*pt
:取得指针pt指向的值,表达式类型为t*pt = v
:将表达式v的值保存在pt所指向的位置中,表达式的类型为t
-
指向数组的指针
①a:是一个数组,其元素类型为t ; ②pa1:是一个指向t的指针变量,指向数组a中的某个元素
③pa2:是一个指向t的指针变量 ; ④v:是一个表达式 ; ⑤n:是一个整型表达式
a
,&a[0]
:产生一个指向数组第一个元素的指针&a[n]
,a+n
:产生一个指向数组第n号元素的指针,类型为指向t的指针*pa1
:引用pa1指向的元素,类型为t*pa1 = v
:将表达式v的值保存在pa1指向的位置,表达式类型为t++pa1
:将pa1指向数组a的下一个元素,表达式类型为指向t的指针--pa1
:将pa1指向数组a的前一个元素,表达式类型为指向t的指针*++pa1
:将pa1指向数组a的下一个元素,然后引用该元素,表达式d的类型为t*pa1++
:应用pt所指的元素,表达式的类型为t,然后将pa1指向数组a的下一个元素pa1+n
:生成一个指针,该指针指向数组a中pa1所指向元素后面的第n个元素pal-n
:生成一个指针,该指针指向数组a中pa1所指向元素前面的第n个元素*(pa1+n) = v
:将表达式v的值保存在pa1+n所指向的位置,表达式的类型为tpa1<pa2
:判断pa1指向的元素在数组中的位置是否在pa2所指元素的前面,表达式的类型为整数pa2-pa1
:数组a中pa1所指向的元素和pa2所指向的元素之间的元素个数,表达式的类型为整数*(a+n)
,a[n]
:获取数组a的第n号元素的值,表达式的类型为t
-
指针结构的指针
①x:指向结构的指针; ②ps:一个其类型为指向struct s的指针变量 ;
③m:是类型struct s的成员变量,其类型为t ; ④v:是一个表达式
&x
:产生一个指向x的指针,该指针类型为“指向struct s的指针”ps=&x
:将指针ps指向x,表达式的类型为“指向struct s的指针”ps->m
,(*ps).m
:引用ps所指向的结构的成员变量m,表达式的类型为tps->m = v
:将表达式v的值保存在ps所指向的结构的成员变量m中,表达式的类型为t
-