1.补充第二课
(1)~ 二进制按位取反//一个二进制数,首位0
表示该数是正数,首位是1
表示该数是负数。
(如:0101取反为1010)
源码,反码,补码的概念
源码:范围:-127 ~ +127,最高位是符号位,0表示正数,1表示负数 字长8位
[+0]原 = 0000 0000
[-0]原 = 1000 0000
反码:源码的范围:-127 ~ +127
负数--符号位(即第一位)不变,其他为取反 正数--跟源码一样
补码:源码的范围:-128 ~ +127
正数--跟源码相同 负数--x补=x反+1
如果 [-0]补 = [-0]反 +1 = 1 1111111 + 1 = 1 00000000,这个结果是用来表示 -128,而8位字长的0000 0000是表示[+0]的,产生冲突。其中反码+1,结果只保留低位的7位数字位,溢出的会置位溢出,而结果只保留低七位
**只要是整数,内存中存储的都是二进制的补码
解释代码
int main()
{
int a = 0;//4个字节,32个比特位
int b = ~a;//b是有符号的整型
//000000000000000000000000
//~二进制取反:111111111111111111111111
printf("%d\n", b);//打印b的源码
//111111111111111111111111(b的补码)
//111111111111111111111110(先算b的反码 即补码-1)
//100000000000000000000001=-1(b的结果)
return 0;
}
(2)++ 后置++:自增(先使用,后++) 前置++(与后置相反)
int a=10;
int b = ++a;
printf("a=%d,b=%d\n",a, b);//a=11,b=11
int a=10;
int b = a++;
printf("a=%d,b=%d\n",a, b);//a=11,b=10
--同理
2.其他操作符
(1)关系操作符
(2)逻辑操作符
假 :0 真 :非0
int a = 5;
int b = 3;
int c = a && b;
printf("c=%d\n", c);//c=1(a,b都为真-->真,a,b其中有一个为假-->假)
||(a和b中有一个为真-->真)
(3)条件操作符(三目操作符)
exp1?exp2:exp3
(4)常见下标引用,函数调用
[]:下标引用操作符 arr[4]//数组
():函数调用操作符
(5)常用关键字
break continue case char const default do enum extern goto register signed unsigned
static struct switch tyepdef union void volatile
unsigned 无符号
unsigned int
typedef--类型定义--类型重定义 如typedef unsingned int=typedef u_int
(就是给unsingned int重新起一个名u_int)
static修饰局部变量,改变局部变量的生命周期
修饰全局变量,改变了变量的作用域,让静态的全局变量只能在自己所在的源文件内部使用
修饰函数,改变了函数的链接属性。(一般的函数都具有外部链接属性,就是可以随便被extern声明然后修改。而static把函数的外部连接属性改为内部链接属性,既无法被随便声明)
void test()
{
static int a = 1;
a++;
printf("a=%d\n", a);//2,3,4,5,6
}
int main()
{
int i = 0;
while (i < 5)
{
test();
i++;
}
return 0;
extern:申明外部符号
#define1.定义标识符常量 #define MAX 100
2.定义宏--带参数
#define MAX(X,Y) (X>Y?X:Y)
int main()
{
int a = 10;
int b = 20;
int max = MAX(a, b);
printf("max=%d\n", max);//有了define这两行就等于下面两行了
max = MAX(a, b);
printf("max=%d\n", max);
return 0;
}
2.指针
(1)内存
如何产生地址?32位-->32跟地址线/数据线-->当作电线,里面有正电和负电(1和0)-->二进制
-->可以产生2^32位地址 符号&+变量
int a = 10;//4个字节
int*p = &a;//用来存放地址的变量--指针变量
//printf("%p\n", p);
*p=20;//*解引用操作符/间接访问操作符,使p找到a并改为20
printf("a=%d\n",a);
注意:指针大小在32位平台是4个字节,64位平台是8个字节,不管是谁的地址,统统看是多少位
char ch = 'w';
char* pc = &ch;//p+操作符关键字首字母
printf("%d\n", sizeof(pc));//可以用这个来验证
在上方Debug处点击配置管理器可以调32位和64位加以验证
(2)结构体:C语言怎么描述复杂对象
以书为例:描述一本书需要书名+价格等
struct Book
{
char name[20];//名字
short price;//价格
};//不能漏掉!
int main()
{
//利用结构体类型创建一个该类型的结构体变量
struct Book b1 = { "C语言",55 };
printf("书名:%s\n", b1.name);//.找到b1里面的name
printf("价格:%d元\n", b1.price);
b1.price = 15;
printf("修改后的价格:%d\n", b1.price);
return 0;}
用指针写(.版👇)
struct Book b1 = { "C语言",55 };
struct Book* pb = &b1;
printf("%s\n", (*pb). name);//结构体变量.成员
printf("%d\n", (*pb).price);
(->版👇)
struct Book b1 = { "C语言",55 };
struct Book* pb = &b1;
printf("%s\n", pb->name);//结构体指针->成员
printf("%d\n", pb->price);
ps怎么改上述程序的书名
struct Book b1 = { "C语言",55 };
strcpy(b1.name, "C++");//strcpy-string copy-字符串函数-库函数-string.h
printf("%s\n", b1.name);
return 0;
}