IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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
数据类型的取值范围有区别
数据类型
打印该格式的数据
取值范围
大小(字节)
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
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

进制转换规则

二进制

?八进制

十进制

十六进制

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<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陷阱与缺陷 第7章 可移植性缺陷 7.1 应对C
C语言犄角旮旯的知识之结构体
从零到一快速学会三子棋
【Codeforces Round #805 (Div. 3)(A~C)】
C++中static_cast和dynamic_cast强制类型转
【C++进阶知识继承】继承的赋值转换,菱形虚
D. Yet Another Sorting Problem
牛客华为C++笔试题目(一)
从零开始 学习C/C++的第二十二天 文件读写
2021-07-25
上一篇文章      下一篇文章      查看所有文章
加:2021-10-26 12:02:17  更:2021-10-26 12:04:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
360图书馆 购物 三丰科技 阅读网 日历 万年历 2022年8日历 -2022/8/7 23:48:19-
图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码