写代码步骤:
1.创建工程
2.创建文件 C语言代码中 .c—源文件 .h—头文件 在.c(源文件)中写代码
3.写代码 int main() 主函数——程序的入口——必须存在且只有一个
int是整形 main前面的int表示main函数调用返回一个整形值
void main式主函数写法已经过时
main默认返回类型为int,但这么写属于狗屎行为
文件如何运行起来
test.c——编译器—链接—>test.exe
为什么要将test.cpp改为test.c?
test.cpp——cpp——c plus plus——c++——编译器使用c++语法解析
vs2019是集成开发环境,即集,编辑器,编译器,链接器,调试器于一体的软件
fn是辅助功能键,因为电脑功能的多样化,导致f1,f2等功能改变,此时需要fn+f5实现其本来功能
语法规定语言怎么写是正确的
库函数——C语言本身提供给我们使用的函数——需调用头文件#include——预处理命令 #include| 数据类型 | 打印该格式的数据 | 取值范围 | 大小(字节) |
| char //字符数据类型 | %c 字符 | -128~127 | 1 |
| short //短整形 | %d | 0~65535(2^16-1) | 2 |
| int //整形 | %d 整形十进制 | 0~4294967295(2^32-1) | 4 |
| long // 长整形 | %d | 4/8 | |
| long long(c99)//更长整形 | 8 | ||
| float //单精度浮点数(小数) | %f 浮点型 | 4 | |
| double //双精度浮点数(更精确) | %f/%lf | 8 |
进制转换规则
| 二进制 | 八进制 | 十进制 | 十六进制 | |
| 0,1 | 0~7 | 0~9 | 0~9,A~F | |
| 代表字母 | B | O | D | H |
2945D表示十进制下2945
11B表示二进制下11
2945D=2*10^3+9*10^2+4*10^1+5*10^0 (2,9,4,5指基数,10代表权值)
(R进制—>十进制)
权位展开累加法
例:二进制—>十进制
10100101B=1*2^7+0*2^6+1*2^5+0*2^4+0*2^3+1*2^2+0*2^1+1*2^0=165D
76543210
(十进制—>R进制)
除(乘)R取余(整)法——整数部分除R取余,小数部分乘R取整
例:十进制—>二进制
27D—>11011B
27/2=13……1 低位
13/2= 6……1
6/2= 3………0 |
3/2= 1………1
1/2= 0………0 高位
0.375D—>0.011B
0.375*2=0.75……0 高位
0.75*2= 0.5………1 |
0.5*2=0……………1 低位
C语言中不变(不能改变)的量称为常量
变化(可以改变)的量称为变量 定义方法:变量类型+变量名+赋值
例:int age=150;
float weight=45.6f;(直接写45.6默认为double类型)
char ch=‘w’;
变量分局部变量和全局变量
局部变量和全局变量名起冲突时,局部变量优先
#include
int num2=20; //全局变量定义在代码块({ })之外的变量
int main()
{
int num1=10; //局部变量定义在代码块({ })内部的变量
return 0;
}
int main()
{
{
int a=10; 此时a属于局部变量无法打印出a的值
}
printf("%d",a);
return 0;
}
变量的作用域与生命周期
作用域是使用范围,生命周期是时间段(进入作用域生命周期开始,出作用域生命周期结束)
作用域:程序设计概念,限定变量的可用性的代码范围即为变量的作用域
全局变量的作用域为整个工程
局部变量的作用域为变量所在的局部范围
若有两个源文件num.c,test.c 在test.c中可以使用sum.c中声明的全局变量 //需使用声明外部表示符号extern
int main()
{
extern int g_val; //g_val 在sum.c中定义为全局变量2020
printf("%d",g_val);
return 0;
}
结果打印出2020
局部变量生命周期:进入作用域生命周期开始,出作用域生命周期结束
全局变量生命周期:整个程序的生命周期
C语言中的常量:
1.字面常量是直接写出的数字 例4不能赋给3
2.const修饰的常变量 const—常属性 const int a=3;(此a不能被重新赋值)
3.#define定义的标识符常量 //#define 常量名 值
4.枚举常量 //枚举关键字—enum
enum 常量名
{
枚举常量,
……
};
enum sex
{
male, //枚举常量,枚举这种类型的可能取值
female,
secret
};
int mian()
{
enum sex s=female;
printf("%d,%d,%d",male,female,secret); //打印值为0,1,2,且枚举常量值不可改变
return 0;
}
字符串
由双引号引起的一串字符称为字符串面值,简称字符串。
字符串结束标志是一个 的转义字符, 不算字符串长度——打印字符串:%s,数组名
例:
char a[]="abc";
char b[]={'a','b','c'}; 打印结果:abc
printf("%sn",a); abc烫烫烫烫隠bc
printf("%sn",b); //若在b[]加上一个,0则正常打印(字符数组作字符串用法时也要 来结束)
转义字符——单个转义字符要使用单引号
转义字符,转义原来的意思 其他:a(警告字符,会锋鸣) b f n r
? 在书写连续多个问好使用,防止他们被解析成三字母词
??+其他符号—>三字母词 //在部分编译器中无法使用,使用时将每一个?改为?
t 水平制表符,相当于tab内容。还可以使一堆数据排列整齐
\ 用于表示一个反斜杠,防止他被解释成一个转义字符
' 用于表示字符常量—在需要表示一个字符单引号时,如果' ' '则会当做“和' 出现错误
' ' '可以作为一个单引号字符使用("同理)
ddd ddd表示1~3个八进制数字,如32 ,3和2分别代表两个八进制数字
32指八进制的32所代表的十进制数字作为ASCII码值对应的字符
32(八)—>26(十) ASCII码值26:->,所以32代表->
在685的情况下,只会转义6,8不属于8进制,所以“685”有三个字符(不算 )
xdd dd表示两个十六进制数字,如x61=6*16^1+1*16^0=97
注释
在难懂的代码中说明代码含义
代码中不需要的代码可以直接删除,也可以注释掉
C语言风格注释: 缺点:不能嵌套注释
c++风格注释://………… 可以注释一行,也可以注释多行,是c99后引入的注释方式
注释选中行快捷键:ctrl+k+c
取消注释快捷键:ctrl+u
操作符算数操作符:+,-,*,/,%
移位操作符:>>,<< //移二进制位,变量+移位操作符+移的位数
例:int a=1;
a<<2; //00…………01->0…………100->a=4;
位(二进制位)操作符:&,|,^
&按位与 int a=3, b=5, c=a&b; //c=1 //……001
|按位或 int a=3, b=5, c=a|b; //c=7 //……111
^按位异或 int a=3, b=5, c=a^b; //c=6 //……110
a: ……011 b: ……101
按位与:同为1则为1,反之则为0
按位或:有1则为1,无1则为0
按位异或:对应二进制位相同为0,相异为1
赋值操作符:=,(+=,-=,*=,/=,&=,^=,|=,>>=,<<=)复合操作符 //a=a+10;<=>a+=10;
单目操作符: (单目,双目,三目取决于操作数)
! //逻辑反操作 //C语言中0表示假,1表示真 //!10=0 !0=1
- //负值
+ //正值
& //取地址
sizeof //操作数的类型长度(以字节为单位)(一个汉字字符占两个字节)
(类型) //强制类型转换
~ //对一个数的二进制补码按位取反 //~1010=0101(二进制)
++ //前置++,后置++ //前置++先++后使用,后置反之
-- //前置--,后置-- //同++
关系操作符:>,>=,<,<=,!=,==
!=,==用于测试是否相等
逻辑操作符:&&(逻辑与),||(逻辑或) //逻辑真默认为1
条件操作符:exp1 ?exp2:exp3 //条件判断?条件为真:条件为假 //三目操作符
逗号表达式:exp1,exp2,exp3,…………expN //逗号表达式的值为最后一个子表达式的值
下标引用,函数调用,结构成员
//a[2],[]为下标引用操作符
//函数Add(a,b) ()为函数调用操作符
//结构成员 结构体内容. 和->
原码,反码,补码
计算规则(仅指负整数,其他大同小异)
原码为十进制数的二进制形式(最高位为符号位)
原码符号位不变,其它位按位取反得反码(反码仅为中间的计算状态)
反码加1得补码
例:100…………01(原码)->111…………10(反码)->111…………11(补码)(内存中储存的是补码)
例题:
int a=0,b=~a;
printf("%dn",b); //正数的原码反码补码相同,负数在内存中储存时,储存的是二进制的补码
结果输出-1. //打印的为二进制的原码
b是有符号的整形
二进制码最高位称为符号位(无符号整形没有符号位)
二进制码的最高位为1则为负数,为0则是正数
只要是整数内存,内存中储存的都是二进制补码
负数原码为按正负写出的二级制序列
常见关键字:case,char,const(常变量),default(switch默认),do,double,else,enum(枚举常量), float,for,goto,if,int,long,return, short,sizeof,void,switch auto //在全部变量前,省略了。局部变量会自动销毁,又称自动变量 break //switch语句循环终止 continue //循环语句,结本次循环,进入下一次循环 register //寄存器关键字 寄存器(访问速度很快,容量很小)->高速缓存->内存(访问速度高于硬盘,造价高)->硬盘(容量大) //CPU从内存中调取数据,CPU发展后处理能力变强,内存提供数据的速度跟不上,后改为从寄存器中调用 //使用方向,当a需要大量频繁调用时建议定义为寄存器变量,示例:register int a=10; //register只是起到一个建议的作用,实际放不放入寄存器由系统判断。 //&取的是内存中的地址, 寄存器变量无法取地址 extern //引入外部符号 signed //有符号变量,在int前省略,int定义的变量是有符号的 unsigned//无符号数字,必为正 typedef //类型定义,为类型重定义变量名 //typedef+变量名+变量重命名 //typedef可以重定义类型名 static //静态,在修饰局部变量时,局部变量生命周期变长 //修饰局部变量时,改变了变量的存储类型,从栈区转为静态区 //变为静态变量后,作用域不变,生命周期变为整个工程 union //联合体,共用体 //自定义类型 struct //结构体关键字 while //循环关键字 volatile //较难 关键字不能作为变量名 static修饰全局变量时,改变了变量的作用域,让静态的全局变量只能在自己所在的源文件内部使用,改变了链接属性。 在其他源文件声明一个函数,此源文件用到时,需声明外部函数 extern+返回类型+函数名(参数类型,参数类型,……) //示例:extern int Add(int,int,……); static修饰函数时,就只能在本源文件内部使用,static修饰函数改变了函数连接属性,正常函数具有外部连接属性,static修饰后,外部链接属性变为内部链接属性 宏定义:#define MAX 100 // #define定义标识符常量 #define不是关键字,是预处理命令 定义的是常量不可改。 若全局变量定义在main函数后则,main函数内该全局变量无法识别 define可以定义浮点数常量,字符常量 #define定义的常量只能在定义的下方才能使用 在下面这个代码中,M只能在main函数中使用,add中未识别M。 void add() { printf( "%d", M); } #define M 20 int main() { printf( "%dn", M); add(); return 0; } 宏变换:#define MAX(x,y) (x>y?x:y) //#define 定义宏,所有MAX(x,y)会被替换成(x>y?x:y) 指针 如何产生地址? 电脑数据线或地址线有32位或64位,通电有正负电之分,电信号可以转换为数字信号,32根数据线的所有可能性有2^32个, 通过数据线产生,将这样的二进制序列(例00000000000000000010000100001000,共32位)作为每个内存单元的编号, 语法上讲,编号即为内存的地址。 1内存单元为1字节,32根地址线,意味着2^32byte的内存为4GB 查看地址的方式:printf("%pn",&a); 指针变量,用来存放地址的变量。取地址char* pc=&ch;(ch为字符型)int* p=&a;(a为整形) *p,*是解引用操作符,对p进行解引用操作,找到他所指向的对象 地址在32位电脑上是32位比特位二进制序列,所以需要32个比特位存放,即4字节,在32位机器上一个指针变量大小为4字节 以此类推,在64位机器上一个指针变量的大小为8字节 电脑 8GB——内存 500GB——硬盘 结构体——适用于复杂对象——我们自己创造的一种类型 struct Book { char name[20]; .结构体变量可以用.找到成员 short price; ->结构体“指针”指向成员 }; //;表示结构体结束 …… struct Book b1 = { "C语言程序设计",55 }; //struct Book* pb=&b1; printf( "书名:%sn" , b1.name); //printf("%sn",(*pb).name);//pb->name printf( "价格:%dn", b1.price); //printf("%dn",(*pb).price);//pb->price …… 改结构体书名 b1.price=15;可以直接改,price是变量 name是数组,本质上是地址,不能直接改 需要使用函数strcpy-string copy-字符串拷贝 strcpy(目的地(放到哪里去),拷贝内容); //strcpy(b1.name,"c++"); //结果打印出c++ strcpy会连 一同拷贝 当%s读到 时停止,所以打印出c++ 实际数组中:name[20]={"c++ 序设计 "};


