初识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"};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值