【1】C语言的词法符号
1.概念:
程序设计语言中由若干字符组成的有意义的最小语法单位。
按照词法符号的作用,有如下分类:
关键字、标识符、运算符、分隔符、标点符号
【2】关键字(32个)
1.概念:
由系统预定义的具备特定功能的词法符号
2.分类:
存储类型:auto(自动型)、static(静态型)、extern(外部引用类型)、register(寄存器类型)
数据类型:char(字符型)、short(短整型)、int(整型)、long(长整型)、
float(单精度浮点型)、double(双精度浮点型)、signed(有符号)、unsigned(无符号)
构造类型:struct(结构体类型)、union(共用体类型)、enum(枚举类型)
分支结构语句:if、else、switch、case、default、break、
循环结构语句:for、while、do、goto、continue、
其他:void(空类型)、return(返回值)、sizeof(计算字节大小)、const(只读修饰)、
typedef(重定义类型名)、volatile(防止被编译器优化)
typedef 原类型名 别名;
示例:
#include<stdio.h>
typedef unsigned char uch; //给unsigned char起别名为uch
int main()
{
uch ch = 65;
printf("%c\n",ch);
return 0;
}
【3】运算符
1.算术运算符
+ - * / % ++ –
/ :整数相除,向下取整
% :取余运算只能是整数运算
10 % 3 = 1
++ :自加1
注意:在进行++运算时,要分析++的前后位置,来判断先取值还是先自加。
1)在赋值语句中
int a = 3;
int b = a++; // ++在后,先取值参与赋值运算,再让a自加1.
printf("a = %d b = %d\n",a,b); //a = 4 b = 3
int a = 3;
int b = ++a; // ++在前,先让a自加1再赋值给b。
printf("a = %d b = %d\n",a,b); //a = 4 b = 4
2)在打印语句中
int a = 3;
printf("a = %d\n",a++); //a = 3 先取a的值进行打印,再让a自加1。
int a = 3;
printf("a = %d\n",++a); //a = 4 先让a自加1,再打印a的值。
3)独立成语句时
两者一样,因为语句执行结束,a的值都会自加1.
int a = 3;
a++; // a++ => a = a+1
printf("a = %d\n",a); //a = 4
int a = 3;
++a; // ++a => a = a+1
printf("a = %d\n",a); //a = 4
--:自减1
同++;
简答题:设i = 3,分析(++i)+(++i)+(++i)的结果? //15 12
答:这是C语言的一种未定义行为,由编译器厂家来决定。
//gcc的打印结果是16
2.逻辑运算符
1.&& || !
逻辑运算一般用于判断条件是否成立,
在C语言中通常认为0为假,非0为真。
2. &&(逻辑与)
运算法则:
全真则真,一假则假。
||(逻辑或)
运算法则:
一真则真,全假则假。
截断法则:
&& :如果前面表达式为假,则后面表达式不执行。
|| :如果前面表达式为真,则后面表达式不执行。
3. !(逻辑非)
运算法则:非真则假,非假则真。
3.位运算符
-
& | ~ ^ << >>
一般用于二进制位的运算中 &(位与) 运算法则: 全1则1,有0则0. 例: 0x3c & 0x56 0011 1100 & 0101 0110 = 0001 0100 = 0x14
-
|(位或)
运算法则: 有1则1,全0则0. 例: 0x3c & 0x56 0011 1100 | 0101 0110 = 0111 1110 = 0x7e ~(按位取反) 运算法则: 0取反得1,1取反得0(二进制位) ~0x3c ~0011 1100 =1100 0011 = 0xc3 ~0 正数原码 0000 0000 正数补码 0000 0000 ~ = 1111 1111 负数补码 1111 1111 负数原码 1000 0001 = -1 ~15 正数原码 0000 1111 正数补码 0000 1111 ~= 1111 0000 负数补码 1111 0000 负数原码 1001 0000 = -16 ~(-20) 负数原码 1001 0100 负数补码 1110 1100 ~= 0001 0011 正数补码 0001 0011 正数原码 0001 0011 = 19
~ x = -(x+1)
-
^(异或)
3. #### 运算法则: 相同为0,相异为1. 例: 0x3c ^ 0x56 0011 1100 ^ 0101 0110 = 0110 1010 = 0x6a << 左移 左移几位,右边补几个0. 公式:x << n = x * 2^n 2 << 3 = 16 = 2 * 2^3 8 << 2 = 32 = 8 * 2^2 -5 << 3 = -40 = -5 * 2^3 负数原码 1000 0101 负数补码 1111 1011 <<3 1101 1000 负数补码 1101 1000 负数原码 1010 1000 = -40 -7 << 2 = -28 右移 右移几位,左边补几个符号位。 公式:x >> n = x / 2^n 8 >> 2 = 2 = 8 / 2^2 12 >> 3 = 1 = 12 / 2^3 -48 >> 4 = -3 = -48 / 2^4 负数原码 1011 0000 负数补码 1101 0000 4 1111 1101 负数补码 1111 1101 负数原码 1000 0011 = -3
4.赋值运算符
= += -= *= /= ...
int a = 1;
a += 1; => a = a + 1
a *= 3; => a = a * 3
5.关系运算符
< >= <= == !=
数学表达式: 10 < a < 20
C语言表达式: a>10 && a<20
== 相等
= 赋值
6.条件运算符
-
三目运算符
1. ?: 表达式1?表达式2:表达式3 运算法则: 判断表达式1是否成立,如果成立则执行表达式2,否则执行表达式3; int a = 1,b = 2; int c = --a ? b++ : a++; 问:c = ? // 先执行--a,a=0,再执行c = a++,c = 0; 面试题:用宏定义配合三目运算符实现两数求最大值。 要求:通过宏定义传值 //宏定义传值 #define ADD(a,b) a+b ADD(1,2) = 3 c = a>b ? a : b; #define MAX(a,b) a>b ? a : b printf("%d\n",MAX(3,5));
【4】运算符优先级
单目运算符 ! ~ ++ --
算术运算符 * / % + -
移位运算符 << >>
关系运算符 < <= > >= == !=
位与运算符 &
异或运算符 ^ |
逻辑运算符 && ||
条件运算符 ?:
赋值运算符 = += -= *= ...
口诀:单算移关与,异或逻条赋。 (优先级从高到低)
从右向左单条赋。
a = 3;
int c = a-=a*=a+=a //赋值运算结合性从右向左
c = ? // 0
a-=a*=a+=a
a+=a => a = a + a = 3 + 3 = 6
a-=a*=6
a*=6 => a = a * 6 = 6 * 6 = 36
a-=36
a = a - 36 = 36 - 36 = 0
【5】输入输出语句
-
格式化输出函数printf
int printf(const char *format, ...); 功能:按照用户指定的输出格式打印到终端界面 参数:const char *format 输出格式 %c --- 字符 %s --- 字符串 %d --- 十进制整数 %nd 右对齐占n位 %-nd 左对齐占n位 %0nd 右对齐占n位不够位补0 %ld --- long long int 4字节 %lld --- long long 8字节 %#o --- 八进制整数 %o 不带前缀标志 %#x --- 十六进制整数 %x 不带前缀标志 %#X -> 0XFF %f --- 单精度浮点型小数 float %.nf 指定保留到小数点后n位 %lf --- 双精度浮点型小数 double %p --- 地址 &取地址符 %u --- 无符号数 %e --- 指数 %.ne
… 要输出的变量或表达式
返回值:实际输出的字符个数
2.格式化输入函数scanf
int scanf(const char *format, ...);
功能:按照用户指定的输入格式从终端输入数据
参数:const char *format 格式 (同printf)
... 要输入的变量的地址
int num;
scanf("%d",&num);
char a,b;
scanf("%c%c",&a,&b); //两个字符紧挨着输入
// 若输入abc,只能成功输入字符a和字符b。
// 如果输入a空格b,那么空格会被输入给b。
int a,b;
scanf("%d",&a) 10 20
终端输入整型数能够成功输入,如果输入非整型数则输入失败。
scanf("%d%d",&a,&b);
// 10空格20 10回车20 10Tab20 能够成功输入两个数
scanf("%d\n",&a);
scanf("%d\t",&a);
scanf("%d\r",&a);
输入整型数后按回车并不能结束,只有再次输入一个字符才能结束。
结束进程:ctrl + c
int a;
char b;
scanf("%d%c",&a,&b);
//输入1空格a或者1回车a,会将空格符或换行符赋给b。
scanf("%d %c",&a,&b);
//输入1空格a或者1回车a都可以成功输入。
scanf("%d,%c",&a,&b);
//输入1,a可以成功输入。
scanf("%*c%c",&b);
//%*c吞掉任意一个字符
//空格为scanf输入结束的标志
返回值:成功输入的数据个数
3.字符输入函数getchar
int getchar(void)
功能:从终端输入一个字符
参数:无
返回值:输入字符的ASCII码
//作用:处理垃圾字符
4.字符输出函数putchar
int putchar(int c);
功能:向终端输出一个字符
参数:要输出字符的ascii
返回值:同参数
输出换行:
printf("\n");
putchar('\n');
putchar(10);
周末作业:
1.完成运算符练习题(适当写一下解题思路),交给陈剑,周日之前收齐并打包。
2.预习分支结构语句(if-else、switch-case),完成时钟代码。