目录
前言
此为本人在学习嵌入式过程中的笔记,包含了c较为完整的基础用法和一些需要注意的细节,适用于复习和巩固c语言的人群。
计算机存储单位
在计算机内部,信息都是釆用二进制的形式进行存储、运算、处理和传输的。
基本储存单元:位(bit) 和 字节(byte)
1字节=8位
1B=8bit
1KB=1024B 2的10次方 10月24日
1MB=1024KB
1GB=1024MB
1TB=1024GB
注意:bit是计算机最小存储单位,bit只能存储0和1。
计算机的数据表示形式
数值型数据
二进制 | 八进制 | 十进制 | 十六进制 | |
计算方式 | 逢2进 | 逢8进 | 逢10进 | 逢16进 |
元素 | 0 1 | 0~7 | 0~9 | 0~9 a~f |
常用的进制转换
十进制转二进制
1.短除法 除2倒取余
2.拆分法 拆分成2的次方和 8421
3.程序员计算器
二转十
2的次方和,从右向左依次增加
如:101100=32+8+4=44
八转十
1.一位八进制用三位二进制表示,以数字0开头。 (注意从右往左)
031=011 001
0765=111 110 101
十转八
1.先转二再转八
例如:165 => 10100101 => 010 100 101 => 245
2.短除法 (短除法也适用于是转八的情况)
例如:165转成八进制:
结果为:245
解析:
二转八
从右向左,最后不足三位的高位补零
11 001 011=0313
十六转二
一位十六进制用四位二进制表示,以0x开头
十六进制表示 | a | b | c | d | e | f |
对应数字 | 10 | 11 | 12 | 13 | 14 | 15 |
0x3ce=0011 1100 1110
二转十六
二进制四位对应十六进制
非数值型数据
ascii码:计算机中的字符都有一个序号,计算机根据这个序号唯一确定相应的字符,计算机中存储的字符都是以ascii码序号对应的二进制存储的。
常用ascii码
字符 | '\0' | '\n' | '0' | ‘A’ | 'a' |
作用 | 字符串结束标志 | 换行符 | 字符数字0 | 大写字母A | 小写字母a |
对应ascii码 | 0 | 10 | 48 | 65 | 97 |
转换关系:
字符'2' - 48 = 数字2
'A'+32='a'
练习:
答案:g
词法符号
关键字、运算符、标识符、分隔符、标点符号
关键字(背过)
系统预定义的具有特殊功能的词法符号
分类:
存储类型:auto(自动) static(静态) extern(外部引用) register(寄存器)
数据类型:int char short long float double signed unsigned
构造数据类型:struct union enum
选择结构:if else switch case default
循环结构:for while do goto break continue
其他:void typedef(重定义) const(常量化) sizeof volatile(防止编译器优化) return
补充*(了解):
存储区:
栈区:局部变量 由系统自动开辟空间、自动回收。
堆区:由程序员手动开辟空间malloc函数、回收free函数。
全局区/静态区:.bss .data 全局变量(全局区) static修饰的变量(静态区)。
常量区: char *p="hello";。
标识符
变量名、宏名、函数名、重定义名的规范
命名规则:
- 由数字、字母、下划线组成
- 开头不能是数字
- 不能和关键字重复
- 见名知意
驼峰命名法: niceDay 小驼峰命名法 NiceDay 大驼峰命名法。(为了增强代码的可读性)
练习:
以下自定义变量名哪些不合法:
x y sum a100 _A7b_3x 3’a x*y @ b.8 while
运算符
算术运算符 逻辑运算符 位运算符 关系运算符 赋值运算符 三目运算符
当数字作为判断条件时,0为假,非0为真
补充*()了解:交换两数数值的方法:
1.定义第三变量交换法
2.加法交换法:
如;
int a=6,b=8;
a=a+b;
b=a-b;
a=a-b;
3.位运算法;
如:
int a=6,b=8;
a=a^b;
b=a^b;
a=a^b;
注意:位运算法可以用于所有数据类型的值交换,优点是节省内存空间节省系统资源。
算术运算符
+ - * / % ++ --
/整数相除,向下取整
int a=5/2; //a=2
float a=5/2; //a=2.000000
float a=5/2.0; //a=2.500000
float a=(float)5/2; //(float)5--->强制转换,把整型5强转成浮点型,只在当前这一行生效
%只能用于整数运算
如:10%3=1
练习:
把1234的个十百千位分别输出到终端。
答案:
笔试真题:
答案:
b
单目运算符:++ --;
a++----->a=a+1 (a++相当于a=a+1)
独立成句:
int a=2;
a++;
printf("%d\n",a); //3
int a=2;
++a;
printf("%d\n",a); //3
在赋值运算中:
int a=2;
int b=++a; //先+ 后=
printf("%d %d\n",a,b); //a=3,b=3
int a=2;
int b=a++; //先= 后+
printf("%d %d\n",a,b); //a=3,b=2
打印语句:
int a=2;
1)printf("%d\n",a++); //2
2)printf("%d\n",++a); //3
练习:
1. 以下程序输出结果是
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 10;
int b = a++; //a=11,b=10
int c = a + b; //c=21
int d = (b++) +c; //d=10+21=31 b=11
printf("%d = \n",d);
return 0;
}
/*[单选题]
A. d = 31
B. d = 32
C. d = 33
D. d = 34 */
答案:
9
逻辑运算符
&& || !
&&逻辑与:全真则真,一假则假
||逻辑或:一真则真,全假则假
!逻辑非:非真即假,非假则真 0假 1真
printf("%d\n",3>2&&5<9);
printf("%d\n",3>2||5<9||8>99);
printf("%d\n",5<9 && !(8>99));
截断法则:
逻辑或运算中:如果前边的表达式为真,则后边的表达式不再执行,返回真
逻辑与运算中:如果前边的表达式为假,则后边的表达式不再执行,返回假
c语言笔试真题练习:
1.
#include <stdio.h>
int main()
{
int a=5,b=6,c=7,d=8,m=2,n=2;
(m=a<b)||(n=c>d);
printf("%d %d",m,n);
}
答案:1 2
2.
1. #include <stdio.h>
int main(int argc, char *argv[])
{
int a = 10;
int b = a--; //b=10 a=9
int c = a + b + 2; //c=10+9+2=21
int d = (b--) + (++c); //d=10+22=32
printf("%d\n",d);
}
/*[单选题]
A. d = 31
B. d = 32
C. d = 33
D. d = 34 */
答案:B
3.
4.
5.
位运算
注意,位运算都是补码之间的运算,运算结果转为原码即为所得结果的十进制表达形式
& | ^ ~ << >> 二进制 0 1
&位与:全1则1,有0则0
|位或:有1则1,全0则0
^异或:不同为1,相同为0
~取反:0-->1 1-->0
整数在内存中存储的形式是补码的二进制
整数的三种二进制表示:
原码 | 反码 | 补码 | |
正数 | 本身 | 本身 | 本身 |
负数 | 本身 | 除符号位,其他位按位取反 | 反码+1 |
举例:
int a=3 int类型占4字节,1字节=8位,符号位0---正数 1---负数
原码: 0000 0000 0000 0000 0000 0000 0000 0011
反码: 0000 0000 0000 0000 0000 0000 0000 0011
补码: 0000 0000 0000 0000 0000 0000 0000 0011
int a=-3
原码: 1000 0000 0000 0000 0000 0000 0000 0011
反码: 1111 1111 1111 1111 1111 1111 1111 1100
补码: 1111 1111 1111 1111 1111 1111 1111 1101
&按位与
int a=3,b=5;
int c=a&b;
//a: 11
//b:101
//c:001
printf("%d\n",c);//1
/****************************************************************************
int a=3,b=-5;
int c=a&b;
//a: 11
printf("%d\n",c);//3
3:
补码:0000 0000 0000 0000 0000 0000 0000 0011
-5:
原码:1000 0000 0000 0000 0000 0000 0000 0101
反码:1111 1111 1111 1111 1111 1111 1111 1010
补码:1111 1111 1111 1111 1111 1111 1111 1011
补码:0000 0000 0000 0000 0000 0000 0000 0011
3&-5
&: 0000 0000 0000 0000 0000 0000 0000 0011
结果为:3
|按位或
//运算举例
12 | -10
12补码:
0000 0000 0000 0000 0000 0000 0000 1100
-10补码:
1111 1111 1111 1111 1111 1111 1111 0110
12补码 | -10补码:
0000 0000 0000 0000 0000 0000 0000 1100
1111 1111 1111 1111 1111 1111 1111 0110
补码计算结果:
1111 1111 1111 1111 1111 1111 1111 1110
反码:
1111 1111 1111 1111 1111 1111 1111 1101
原码:
1000 0000 0000 0000 0000 0000 0000 0010----> -2
c语言笔试真题练习:
~取反 单目运算符
int a=3;
int c=~a;
//a: 11
printf("%d\n",c);
3的补码:
0000 0000 0000 0000 0000 0000 0000 0011
~取反,得到补码:
1111 1111 1111 1111 1111 1111 1111 1100
反码:
1111 1111 1111 1111 1111 1111 1111 1011
原码:
1000 0000 0000 0000 0000 0000 0000 0100==-4
<<左移
左移几位,右边补几个0
例如:
8<<2=32 公式:8*2^2=32
-5<<3=-4 -5*2^3=-40
>>右移
右移几位,左边用0补充,右边丢弃
例如:
8>>2=2 8/2^2=2
-48>>4= 3 -48/2^4=-3
练习:
1.设int b=2;表达式 (b>>2)/(b>>1)的值是()
A.0 B.2 C.4 D.8
2.变量x和y的值相等,且为非零值,则以下选项中,结果为0的表达式是()
A.x||y B.x|y C.x&y D.x^y
3.以下程序升输出结果是()。
int main()
{
char x=040;//040-->100000
printf("%o\n",x<<1); //1 000 000
return 0;
}
A.100 B.80 C.64 D.32
答案: A D A
置一公式:a|(1<<n) 10010--->10110
置零公式:a&(~(1<<n)) 10010--->10000
对应位取反操作:a^(1<<b)
关系运算符
> < >= <= == !=
禁止1<x<5 x>1&&x<5
=赋值 ==等于
赋值运算符
= += -= *= /= %=
a-=5; == a=a-5;
练习:
答案:60