C语言知识了解

20 篇文章 0 订阅
10 篇文章 0 订阅

# 标识符

##1.什么是标示符

- 标识符就是程序员自己在程序中起的一些名字。

    +程序员自己起的名字,不能使用和关键字同名的名字。

##2. 标识符的作用

- 标识符,从字面上理解就是用来标识某些东西的符号,标识的目的就是为了将这些东西区分开来

- 标识符的作用跟人类的名字差不多,为了区分每个人,就在每个人出生的时候起了个名字

- C语言是由函数构成的,一个C程序中可能会有多个函数,为了区分这些函数,就给每一个函数都起了个名称。函数的名称就是标识符的一种。除了函数,以后还会学到“变量”这个概念,变量的名称也是标识符

##3.标识符命名规则

- 1.只能由26个英文字母的大小写、10个阿拉伯数字0~9、下划线_组成(现在也可以用$组成)

- 2.严格区分大小写,比如test和Test是2个不同的标识符

- 3.不能以数字开头

- 4.不可以使用关键字作为标识符

##1.标识符命名规范

- 命名规范:

    +起一个有意义名字,能够提高代码的可读性

##2.标示符命名规范详述

- 驼峰命名法(Camel-Case)是电脑程序编写时的一套命名规则(惯例):

    +程序员们为了自己的代码能更容易的在同行之间交流,所以才取统一的可读性比较好的命名方式。

       * 例如:有些程序员喜欢全部小写,有些程序员喜欢用下划线,所以如果要写一个my name的变量,他们常用的写法会有myname、my_name、MyName或者myName。这样的命名规则不适合所有程序员阅读,而利用驼峰命名法来表示,可以增加程序可读性。

    +驼峰命名法就是当变量名或函数名是由一个或多个单字连结在一起,而构成的唯一识别字时,第一个单字以小写字母开始,第二个单字的首字母大写;或每一个单字的首字母都采用大写字母

       * 例如:myFirstName、myLastName,这样的变量名看上去就像骆驼峰一样此起彼伏,故得名。

    +驼峰命名法(Camel-Case)一词来自 Perl 语言中普遍使用的大小写混合格式,

    驼峰命名法的命名规则可视为一种惯例,并无绝对与强制,为的是增加识别和可读性。

#3.其它标识符命名规范

- 命名应当直观且可以拼读,要望文知意,便于记忆和阅读。

    +标识符最好采用英文单词或其组合,不允许使用拼音。程序中的英文单词一般不要太复杂, 用词应当准确。

- 命名的长度应当符合“min-length&& max-information”原则。

    +C是一种简洁的语言, 命名也应该是简洁的。例如变量名MaxVal 就比 MaxValueUntilOverflow 好用。标识符的长度一般不要过长,较长的单词可通过去掉“元音”形成缩写。

    +另外,英文词尽量不缩写,特别是非常用专业名词,如果有缩写,在同一系统中对同一单词必须使用相同的表示法,并且注明其意思。

    +大多数ANSI编译程序允许有至多31个有效字符。也就是说,只有变量名或函数名的前31个字符的唯一性会被检查,其余的字符将被忽略掉。

- 当标识符由多个词组成时,建议采用“驼峰命名法”。

    +比如:int CurrentVal;这样的名字看起来比较清晰,远比一长串字符好得多。

- 尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号。

    +比如驱动开发时为管脚命名,非编号名字反而不好。初学者总是喜欢用带编号的变量名或函数名,这样子看上去很简单方便,但其实是一颗颗定时炸弹。

- 对在多个文件之间共同使用的全局变量或函数要加范围限定符

    +(建议使用模块名(缩写)作为范围限定符)。(GUI_ ,etc)标识符的命名规则

- 标识符名分为两部分:规范标识符前缀(后缀) + 含义标识。

+ 非全局变量可以不用使用范围限定符前缀。

 

# 注释基本概念

1.什么是注释

2.为什么要使用注释?

3. 【应用注释的目的和应用场景

4.注释的特点

##1.什么是注释

- 注释,从字面上看,就是注解、解释的意思

- 注释可以用来解释某一段程序或者某一行代码是什么意思,方便程序员之间的交流。写完一行代码后,加上相应的注释,那么别人看到这个注释就知道这行代码的作用

- 注释可以是任何文字

- 在开发工具中注释一般是绿色

> 温馨提示:

    >+ 初学者编写程序可以养成习惯:先写注释再写代码。

    >+ 将自己的思想通过注释先整理出来,在用代码去体现。

##2.为什么要使用注释?

    >+解释代码

    >+做函数说明

    >+作思路分析

##3.应用注释的目的和应用场景

- 常见用法一(解释代码):

-(UIBarButtonItem *)initWithNorImage:(NSString *)norimage higImage:(NSString*)higImage title:(NSString *)title target:(id)target action:(SEL)action

{

    // 1.创建一个按钮

    UIButton *btn = [[UIButton alloc] init];

    // 2.设置按钮的默认图片和高亮图片

    if (norimage != nil &&

        ![norimageisEqualToString:@""]) {

        // 图片不为空

 [btn setImage:[UIImage imageNamed:norimage] forState:UIControlStateNormal];

    }

    if (higImage != nil &&

        ![higImageisEqualToString:@""]) {

        // 图片不为空

        [btn setImage:[UIImageimageNamed:higImage] forState:UIControlStateHighlighted];

    }

    // 设置标题

    [btn setTitle:titleforState:UIControlStateNormal];

 

    // 3.监听按钮的点击事件

    [btn addTarget:target action:actionforControlEvents:UIControlEventTouchUpInside];

    // 4.设置按钮的frame

    // 可以调用控件的sizeToFit方法来自动调整控件的大小

    [btn sizeToFit];

    // 5.根据按钮创建BarButtonItem

    return [[UIBarButtonItem alloc]initWithCustomView:btn];

}

```

- 常见用法二(做函数说明):

 *  创建item

 * @param norimage 默认状态的图片

 * @param higImage 高亮状态的图片

 * @param title    标题

 * @return 创建好的item

- 常见用法三(做思路分析):

##4.注释的特点

- 注释是写给人看的,不是给计算机看的。因此当编译程序的时候,并不会将注释编译到.o目标文件中

- 从.o文件的大小可以间接看出注释后的代码并没有被编译

- 检查代码的作用

- 排除错误

 

# 注释的使用

1.单行注释

2.多行注释

3.注释使用注意

##1.单行注释

- // 进行单行注释

    + 使用范围:任何地方都可以写注释:函数外面、里面,每一条语句后面

    + 作用范围: 从第二个斜线到这一行末尾

    + 快捷键:Command+/

##2.多行注释

- /*  */ 进行多行注释

     + 使用范围:任何地方都可以:函数外面、里面,每一条语句后面

     + 作用范围: 从第一个  /* 到最近的一个 */ 

##3.注释使用嵌套

- 1.单行注释可以嵌套单行注释、多行注释

// 小明 // 小红

// /* 校长 */

// 帅哥

 

- 2.多行注释可以嵌套单行注释

/*

// 作者:张三

// 描述:第一个C语言程序作用:这是一个主函数,C程序的入口点

 */

- 3.多行注释不能嵌套多行注释

/* 哈哈哈

     /*嘻嘻嘻*/

 呵呵呵 */

 

# 数据及数据类型

1.什么是数据?

2.数据类型

3. C语言数据类型概述

 

##1.什么是数据?

- 生活中时时刻刻都在跟数据打交道,比如体重、血压、股价等。在我们使用计算机的过程中,会接触到各种各样的数据,有文档数据、图片数据、视频数据,还有聊QQ时产生的文字数据、用迅雷下载的文件数据等。

##2.数据类型

- 数据的分类

    + 静态的数据

    + 动态的数据

- 静态的数据

    + 概念:静态数据是指一些永久性的数据,一般存储在硬盘中。硬盘的存储空间一般都比较大,现在普通计算机的硬盘都有500G左右,因此硬盘中可以存放一些比较大的文件。

    + 存储的时长:计算机关闭之后再开启,这些数据依旧还在,只要你不主动删掉或者硬盘没坏,这些数据永远都在

    + 哪些是静态数据:静态数据一般是以文件的形式存储在硬盘上,比如文档、照片、视频等。

 

- 动态的数据

    + 概念:动态数据指在程序运行过程中,动态产生的临时数据,一般存储在内存中。内存的存储空间一般都比较小,现在普通计算机的内存只有8G左右,因此要谨慎使用内存,不要占用太多的内存空间。

    + 存储的时长:计算机关闭之后,这些临时数据就会被清除。

    + 哪些是动态数据:当运行某个程序(软件)时,整个程序就会被加载到内存中,在程序运行过程中,会产生各种各样的临时数据,这些临时数据都是存储在内存中的。当程序停止运行或者计算机被强制关闭时,这个程序产生的所有临时数据都会被清除。

    + 你可能会问:既然硬盘的存储空间这么大,为何不把所有的应用程序加载到硬盘中去执行呢?有个主要原因是内存的访问速度比硬盘快N倍。

- 静态数据和动态数据的相互转换

    + 静态数据到动态数据(也就是从磁盘加载到内存。)

    + 动态数据和静态数据的相互转换

        * 如手机拍照片存储到手机的硬盘上

- 数据的计量单位

    + 不管是静态还是动态数据,都是0和1组成的。0和1如何组成这么多的数据?

    + 数据都有大小,静态数据就会占用硬盘的空间,动态数据就占用内存的空间

    + 数据越大,包含的0和1就越多.

比特位和字节

 1 B(Byte字节) = 8 bit(位)

1 KB(KByte) =1024 B

1 MB = 1024 KB

1 GB = 1024 MB

1 TB = 1024 GB

 

##3.C语言数据类型概述

- 作为程序员, 最关心的是内存中的动态数据,因为我们写的程序就是在内存中的

- 程序在运行过程中会产生各种各样的临时数据, 为了方便数据的运算和操作, C语言对这些数据进行了分类, 提供了丰富的数据类型

- C语言中有4大类数据类型:基本类型、构造类型、指针类型、空类型

    + 常见的数据类型有:int、float、double、char

    + 整型:用于准确地表示整数,根据表示范围的不同分为以下三种:

        * 短整型(short) < 整型(int) < 长整型(long)

    + 实型(浮点型):用于标识实数(小数)根据范围和精度不同分为以下两种:

        *单精度浮点数(float) < 双精度浮点数(double)

        * 注意:float只能够保证7位数字是有效的!!!

    + 字符型:用来描述单个字符,char

 

# Scanf函数注意事项

##1.scanf使用注意事项

- 如果在输入时,输入了多个空格、回车、Tab都会被系统忽略的

- 如果要获取的内容是多个整数,中间输入多个空格、回车、Tab都会被系统忽略

- 如果要获取的内容是多个实型,中间输入多个空格、回车、Tab都会被系统忽略

- 非法的格式输入,得不到想要的结果

- 混合整形和字符型数据接收

    +当整形的数和字符混合输入时,要避免“空格”的错误输入带来的麻烦

    +为防止混合输入空格造成的错误,可通过添加普通的分隔符解决,如:逗号

     

- 关于使用"\n"的问题

    +scanf函数当遇到回车的时候,会结束执行

    +所以在scanf中,尽量不要使用 \n

    + 如果在scanf中使用了\n,需要原样输入"\n"

 #Scanf函数实现原理

##1.scanf的运行原理

- 系统会将用户输入的内容了放入输入缓冲区

- scanf方式会从输入缓冲区中逐个取出内容赋值给格式符, 如果类型不一致不会修改原有数据

- 如果输入缓冲区的内容不为空,scanf会一直从缓冲区中获取,而不要求再次输入

补充:如果原来输入错误,输入缓冲区内有内容,使用rewind(stdin)函数可以清空缓存,再继续输入.

 

# printf函数注意事项

##1.域宽问题

- %d:按整型数据的实际长度输出。如果想输出指定宽度可以指定域宽

- %md-->m域宽,打印出来以后,在控制台上,显示m位

    +如果我们要打印的数的位数如果超过我们设定m 则原样输出

    +如果我们要打印的数的位数如果小于我们设定的位数,则补空白,具体如下:

    +如果m为正数,则左对齐(左侧补空白)

    +**如果m为负数,则右对齐(右侧补空白)

   // 如果m为负数,则右对齐(右侧补空白)

   printf("|%-5d|",88);

输出结果:|88   |

   // 如果m为正数,则左对齐(左侧补空白)

   printf("|%5d|",88);

输出结果:|   88|

   // %0md 表示,位数不足部分补“0”

   printf("|%05d|",88);

输出结果:|00088|

常用于日期, 图片处理等

##2.转义字符问题

- 如果想输出字符"%",则应该在“格式控制”字符串中用连续两个%表示

printf("%f%%", 1.0/3);

输出结果: 0.333333%。

\n 换行,相当于敲一下回车。

\t 跳到下一个tab位置,相当于按一下键盘上的tab键。 \b 退格,相当于按一下backspace。

\r 使光标回到本行开头。

\f 换页,光标移到到下页开头。

\\ 输出\字符,也就是在屏幕上显示一个\字符。

\' 输出'字符,也就是在屏幕上显示一个'字符。

\" 输出"字符,也就是在屏幕上显示一个"字符

 

# 常量基本概念

##1.什么是常量?

- 常量,表示一些固定的数据,也就是不能改变的数据

##2.常量分类

- 整型常量,也就是整常数。

    + 二进制

    + 十进制

    + 八进制

    + 十六进制

- 实型常量。

    + 单精度

    + 双精度

- 字符型常量:用' '(单引号)括起来的

    + 普通字符

    + 转义字符

- 字符串常量。

    + 将一个或者多个字符用双引号("")括起来,这样构成的就是字符串常量。

    + 注意字符串常量和字符型常量是不一样的。

 

# 不同类型常量的表示方法

##1.整型常量

- 整型常量可以用三种样子:

    + 十进制整数。如356,-120,0。

    + 八进制整数。八进制形式的常量都以0开头,如0123,也就是十进制的83; -011,也就是十进制的-9。

    + 十六进制整数。十六进制的常量都是以0x开头,如0x123,就是十进制的291。

    + 二进制整数。逢二进一 0b开头

##2.实型常量

- 实型常量又分两种:

    + 单精度小数:以f结尾

    + 双精度小数:十进制小数形式。注意: 0.0也是实型常量。

实型的另一种表示形式:

    + 指数形式。大家都应该知道应该知道科学计数法,指数形式的常量就是科学计数法的另一种表示,比如123000,用科学计数法表示为1.23×10的5次方,用C语言表示就是1.23e5或1.23E5,注意e或E的前面必须要有数字,而且e或E后面的数字一定要是整数。

##3.字符常量

- 字符型常量都是用''(单引号)括起来的,其表现形式可以有两种:

    + 一般形式。一个字符用''括起来,注意:只能有一个字符。

    + 特殊形式。特殊形式都是以\开头,它们在屏幕上不会直接显示出来,而是根据其特定的功能来显示的,这些特殊字符常量有:

\n 换行,相当于敲一下回车。

\t 跳到下一个tab位置,相当于按一下键盘上的tab键。

\b 退格,相当于按一下backspace。

\r 回车。

\f 换页,光标移到到下页开头。

\\ 输出\字符,也就是在屏幕上显示一个\字符。

\' 输出'字符,也就是在屏幕上显示一个'字符。

\" 输出"字符,也就是在屏幕上显示一个"字符。

\ddd 1位到3位八进制数表示的字符。

例如:使用'\376',则在屏幕上显示一个黑色的方块。 \xhh 1位到2位十六进制数表示的字符。注意x不能丢了

##4.字符串常量

- 字符串常量与字符常量不同的地方是,字符串常量是用""把字符串括起来,所以'a'和"a"是不一样的,而且系统会在字符串常量的末尾自动加一个字符串结束标志('\0')。

##5.自定义常量

- 格式: const 数据类型 常量名称 = 值

    + 例如: const int NUM =998;

 

# 变量基本概念

##1.什么是变量?

- 表示的数据是可以经常修改的。当一个数据的值需要经常改变或者不确定时,就应该用变量来表示。

    +例如:游戏积分

    +例如:你去超市,放东西到储物柜的一格,他会给你一张纸条,你根据这个纸条才可以拿回自己的东西,储物柜的一格就是变量的内存空间,字条就是变量名,你拿和放就是修改变量名对应内存中的数据

    +变量分为全局变量,局部变量。全局变量定义在函数外部,程序开始到结束都一直在,而局部变量定义在函数内部,只能供函数使用,在函数内部有效;

##2.如何定义变量

- 定义变量(声明), 任何变量在使用之前,必须先进行定义。

- 定义变量的目的:在内存中分配一块存储空间给变量,方便以后存储数据。

- 如果定义了多个变量,就会为这多个变量分别分配不同的存储空间。

    +**格式1: 变量类型变量名称 ;

   int a;

   float b;

   char ch;

    +**格式2:变量类型变量名称,变量名称;**

    +连续定义, 多个变量之间用逗号(,)号隔开

   int a,b;

   int a,b,c,d;

>+ 不同类型的变量占用不同大小的存储空间。内存极其有限,分配适当的存储空间

- 变量明的命名的规范

- 变量名属于标识符,所以必须严格遵守标识符的命名原则

- 变量名要尽可能的望文知意、简洁

 

# 变量初始化和引用

##1.如何使用变量?

- 赋值就是往变量里面存放东西。赋值语句后带个分号;

int value;

value = 998; // 赋值

   >+ 注意:这里的等号=,并不是数学中的“相等”,而是C语言中的赋值运算符,作用是将右边的常量998赋值给左边的变量value

   >+ (1)赋值的时候,  = 号的左侧必须是变量(10=b,错误)

   >+ (2)规范:习惯将 = 的两侧各加上一个 空格

##2.变量的初始化

- 变量第一次赋值,可以称为“初始化”

- 初始化的两种形式

    +先定义,后初始化

int value;

value = 998; // 初始化

    +定义的同时进行初始化

int a = 10; // 完全初始化

int a, b=10; //部分初始化

int a=4, b=2; // 完全初始化

    +其它表现形式

       * 批量初始化

        int a,b,c;

        a = b =c =0;

    +思考: 不初始化里面存储什么?

   int a; //不会报错,a里面存的内容:

   1)随机数

   2)上次程序分配的存储空间,存数一些内容,“垃圾”

   3)系统正在用的一些数据

##3.如何修改变量值?

- 可以修改变量的值,多次赋值。每次赋值都会覆盖原来的值

int i = 10;

i = 20; // 修改变量值

##4.变量之间的值传递

- 可以将一个变量的值赋值给另一个变量

           inta = 10;

           intb = a;

- 连续赋值

int a,b,c;

a = b =c =0;

##5.如何查看变量的值?

- 使用printf输出一个/多个变量的值

int a = 10, c = 11;

printf("a=%d, c=%d", a, c);

- double\float\char的输出,格式符的一些小技巧

double height = 1.75;

char blood = 'A';

printf("height=%.2f, 血型是%c",height,  blood);

 

# 变量的作用域

##1.变量的作用域

- C语言中所有变量都有自己的作用域,申明变量的类型不同,其作用域也不同。C语言中的变量,按照作用域的范围可分为两种,即局部变量和全局变量。

##2.局部变量

- 局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内(代码块), 离开该函数后再使用这种变量是非法的。

    +例如:

int main(){

   int i = 998; // 作用域开始

   return 0;

}// 作用域结束

```

int main(){

    {

       int i = 998; // 作用域开始

   }// 作用域结束

   return 0;

}

```

int main(){

    {

       {

           int i = 998;// 作用域开始

       }// 作用域结束

    }

   return 0;

}

```

- 作用域补充说明:

    +主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。同时主函数中也不能使用其它函数中定义的变量。因为主函数也是一个函数,它与其它函数是平行关系。

    +形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。

    +允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。虽然允许在不同的函数中使用相同的变量名,但是为了使程序明了易懂,不提倡在不同的函数中使用相同的变量名。

##3.全局变量

- 全局变量也称为外部变量,它是在函数外部定义的变量。

##4.常见错误

- 变量名相同

int a = 10; int a = 12;

- 变量的作用域不对

- 变量的创建和释放过程

- 代码块作用域 {  int a = 10; }

 

# 变量内存分析

##1.字节和地址

- 为了更好地理解变量在内存中的存储细节,先来认识一下内存中的“字节”和“地址”。

- 内存以“字节为单位”

##2.变量的存储

- 一个变量所占用的存储空间,不仅跟变量类型有关,而且还跟编译器环境有关系。同一种类型的变量,在不同编译器环境下所占用的存储空间也是不一样的

    + 所占用字节数跟类型有关,跟编译器环境也有关

    +内存由大到小寻址

    +变量存储单元的第一个字节的地址就是该变量的地址

+ 任何变量在内存中都是以二进制的形式存储。一个负数的二进制形式,就是对它的正数的二进制形式进行取反后再+1。(取反的意思就是0变1、1变0)

 

|类型|16位编译器|32位编译器|64位编译器|

|---------|----------------|---------------|-----------------|

|char |     1    |     1   |    1    |

|int   |    2     |   4    |    4    |

|float |     4    |   4    |    4    |

|double |   8     |    8   |    8     |

|short |      2    |    2    |   2    |

|long |    4       |   4    |    8   |

|long long|   8     |    8    |   8    |

|void* |    2      |   4    |     8   |

##3.取值范围

- 不同数据类型所占的存储空间是不一样的,字节长度不一样,包含的二进制位数就不一样,能表示的数据范围也就不一样

- 如果赋值的时候超出了变量的取值范围,那么将损失精度,得到“垃圾数据”(“垃圾数据”就是指并非我们想要的数据)

 

|关键字       |所占字节数| 表示范围 |

|---------------------|----------------|-----------------|

|    int      |     4   |-2(31) ~ 2(31)-1|

|signed short int|     2   |-2(15) ~ 2(15)-1|

|signed long int|      4   |-2(31) ~ 2(31)-1|

| unsigned int |      4    |0 ~ 2(32)-1|

|unsigned short int|  2    |0~ 2(16)-1|

|unsigned long int|   4    |0~ 2(32)-1|

|    float     |   4    |绝对值E-37 ~E+38|

|    double   |   8    |绝对值E-307 ~E+308|

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值