| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 初识C语言 -> 正文阅读 |
|
[C++知识库]初识C语言 |
C语言是一门计算机语言,是人与计算机交流的方式。
硬件只能识别电信号—>正电/负电(1/0)—>二进制
C语言的发展史:
二进制代码手册—>10100001-以ADD为助记符-汇编语言—>B语言—>C语言,c++……高级语言
?? ??? ??? ??? ??? ?低级语言————————————————————————>高级语言
C语言早期不成熟,各方对其功能改动,改动后的C语言不能在不同的编译器上运行
国际制定了C语言的国际标准——C语言标准? ? ? ? 美国ANSI——c89/C90
后来出现的c99/c11不流行——不少编译器不支持
c99之前变量要在最前端,c99标准中支持变长数组,允许用变量来指定数组大小
应用软件
操作系统—windows,linux,Mac
驱动层——联系硬件,操作系统
硬件
操作系统,驱动层属于底层
C语言适用于底层开发
写代码步骤: ?? ?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<stdio.h>——包含
一个叫stdio.h的文件——standard? input?output
数据类型的取值范围有区别
C语言标准规定:sizeof(long)>=sizeof(int)? ? (long?是4还是8取决于平台)
short? age=20;//向内存中申请2字节用来存放20
char? ? ch;? 申请内存
一个汉字字符占两个字节
计算机空间单位转换
字节——计算机的空间单位
bit——比特位——只能存一个二进制位
byte—字节—1?byte=8bit
KB—1KB=1024byte
MB—兆B—1MB=1024KB
GB—1GB=1024MB
TB—1TB=1024GB
PB—1PB=1024TB
进制转换规则
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<stdio.h> 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; } 字符串 由双引号引起的一串字符称为字符串面值,简称字符串。 字符串结束标志是一个\0的转义字符,\0不算字符串长度——打印字符串:%s,数组名 例: char? ? a[]="abc"; char? ? b[]={'a','b','c'};?? ??? ??? ?? ? 打印结果:abc printf("%s\n",a);?? ??? ??? ??? ??? ??? ??? ??? ??? ?? abc烫烫烫烫隠bc printf("%s\n",b);? ? ? ? ? ? ?//若在b[]加上一个,0则正常打印(字符数组作字符串用法时也要\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”有三个字符(不算\0) \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("%d\n",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(
"%d\n",
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("%p\n",&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(
"书名:%s\n"
, b1.name);?? ??? ??? ??? ??? ??? ??? ??? ?? //printf("%s\n",(*pb).name);//pb->name
? ? ?printf(
"价格:%d\n", b1.price);?? ??? ??? ??? ??? ??? ??? ??? ?? ?//printf("%d\n",(*pb).price);//pb->price
……
改结构体书名
b1.price=15;可以直接改,price是变量
name是数组,本质上是地址,不能直接改
需要使用函数strcpy-string? copy-字符串拷贝
strcpy(目的地(放到哪里去),拷贝内容);?? ?? ? //strcpy(b1.name,"c++");? ? //结果打印出c++
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?? ? strcpy会连\0一同拷贝
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?? ? 当%s读到\0时停止,所以打印出c++
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?? ? 实际数组中:name[20]={"c++\0序设计\0"};
|
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 5:27:35- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |