C语言学习记录-Class3-编程基础知识

C语言学习记录-Class3-编程基础知识跟着郝斌老师学C语言_float和double都不能保证可以精确的存储一个小数

C语言学习记录-Class3-编程基础知识"

说明:

本篇记录的是自学C语言的相关过程记录,参考资料是B站郝斌老师的C语言自学教程。本人之前学过一点python,但是觉得C语言还是有必要学一下的。因为刚开始学C语言,所以本篇文章会不断更新。
因为是学习记录,所以条理可能并不是很清晰,后续感觉学的差不多的时候会重新整理一下。

P16. C语言编程基础知识

1. CPU、内存、硬盘、显卡、主板显示器之间的关系;

软件 –> 操作系统 –> 硬盘 –> 内存 –> CPU –> 声卡、显卡等处理。

主板的作用:将硬盘、内存等插在主板上,进行数据传输。

C语言文件运行步骤:源文件 –> compile(编译) –> build(链接) –> run(运行 .exe 文件)

2. 什么是数据类型;

基本类型数据:
整数
整型  --  `int` (4字节)

短整型 -- `short int` (2字节)

长整型  -- `long int` (8字节)
浮点数【实数】

单精度浮点数 – float (4个字节)

双精度浮点数 – double (8个字节)

字符

char (1个字节)

单个字符用单引号括起来;

'A'

字符串用双引号括起来;

"AB"

C语言中没有字符串类型。

复合类型数据:
结构体
枚举
共用体

3. 什么是变量;

存放在内存里的某个空闲单元中的,程序终止之后,所占空间被释放出来。

变量本质就是内存中的一段存储空间。

4. 变量为啥要初始化;

初始化:就是赋值的意思。

# include <stdio.h>

int main(void)
{ 
   
    int i;
    printf("i = %d\n",i);

    return 0;
}

如果没有初始化,那么这里的i就会是上一个内存空间释放后遗留的数值。

当软件运行完毕之后,操作系统将回收该内存空间(注意:操作系统并不会清空该内存空间中遗留下来的数据)。只会更改该内存空间的状态标签。

5. 如何定义变量;

数据类型 变量名 = 要赋的值;

等价于

数据类型  变量名;
变量名  =  要赋的值;

6. 什么是进制;

n进制:逢n进一。

1011B	二进制1011
1357O	八进制1357
2049D	十进制2049
3FB9H	十六进制3FB9

十进制转r进制:

方法:除r取余,余数倒序排列。

7. 常量是以什么样的二进制代码存储在计算机中的;

整数以补码的形式转化为二进制代码存储在计算机中;

实数以IEEE754标准转化为二进制代码存储在计算机中的;

字符的本质也是与整数形式的存储方式相同 (A –> ASCII码将字符转化为数字–> 将数字以补码形式存储);

关于浮点数的存储问题:

  1. floatdouble都不能保证可以精确地存储一个小数。

比如说:如何确定一个浮点型变量是否为0?

if (|x - 0.000001| <= 0.000001)
	是零
else
	不是零
  1. 为什么循环更新时的变量不能定义为浮点型?

因为浮点型时非准确存储。

8. 代码规范化;

林锐 《高质量C/C++编程》

注释占全部文档的1/3;括号要成对地敲;缩进;

C代码基本结构如下所示:

# include <stdio.h>

int main(void)
{ 
   
    // 定义变量
    
    // 对变量进行操作
    
    // 输出值

    return 0;
}

9. 什么是字节;

字节就是存储数据的单位,并且是硬件所能访问的最小单位。

计算机只能操作字节(byte),不能直接操作位(bit),需要通过位运算符来操控位(bit)。

1字节 = 8位

1K = 1024字节

1M = 1024K

1G = 1024M

10. 不同类型数据之间互相赋值的问题;

P30 (C/C++才有这个问题)

数据的溢出

# include <stdio.h>

int main(void)
{ 
   
    int i = 2147483648;
    printf("i = %d\n",i);

    return 0;
}

如上所示:当 i= 2147483648或者更大时,其输出会出错

输出 = -2147483648

为什么会出现这个情况?补码(暂时不考虑,后面会讲)

11. 什么是ASCII;

一些字符串操作经常犯的错误,如下所示:

# include <stdio.h>

int main(void)
{ 
   
    char ch = 'A';  //(第5行)OK,等价于 char ch; ch = 'A';
    //char ch = "AB"; // Error,因为"AB"是字符串,而 char只能定义字符。因此不能把字符串赋值给ch
    //char ch = "A"; // Error,因为"A" 等价于 "A\0",因此"A"也是一个字符串,不能赋值给ch (和第6行错误一样)
    //char ch = 'AB'; // Error,因为 'AB'的定义是错误的,单引号只能定义字符,不能定义字符串

    //char ch = 'B'; // Error,不能和第5行同时存在,因为不能重复定义变量
    ch = 'C'; // OK

    printf("%c\n",ch);

    return 0;
}

总结而言:

  1. 变量不能重复定义,但是可以被重复赋值;
  2. char只能用单引号定义字符变量,而不能定义字符串;
  3. 单引号用来定义字符,双引号用来定义字符串(即使双引号内只有一个字母,如"A",它也表示一个字符串,因为它后面接着一个"\0",也就是"A\0");

关于ASCII码,如下所示:

ASCII就是字符的编码方式:

'A' -- 65
'B' -- 66
'a' -- 97
'0' -- 48

字符 'A'本身对应的ASCII码位65,因此在输出时用%d直接输出了字符'A'对应的ASCII码,即65。(如果是 %c的话,则输出字符'A'

# include <stdio.h>

int main(void)
{ 
   
    char ch = 'A';
    printf("%d\n",ch);

    return 0;
}

12. 字符的存储;

本质与整数的存储方式相同。

基本的输入和输出函数的用法
printf() (重点)

– 将变量内容输出到屏幕;

四种用法:
  1. printf("字符串\n");
  2. printf("输出控制符\n", 输出参数); (输出控制符是因为输出参数本身在计算机内部被转化成了二进制,因此需要指定其输出格式是二进制还是其他)
  3. printf("输出控制符1 输出控制符2,...", 输出参数1, 输出参数2, ...);
  4. printf("输出控制符 非输出控制符", 输出参数);
输出控制符:

为啥需要输出控制符?

  1. 01组成的代码可以表示数据,也可以表示指令,需要输出控制符告诉它怎么去解读;
  2. 如果01组成的代码表示数据的话,那么同样的01代码以不同的输出格式会输出不同的结果;

C语言中的输出控制符如下:

%d										--	int
%ld										--  long int
%c										--  char
%f										-- float
%lf										-- double
%x (%X, %#x, %#X)  // 输出16进制结果		-- int 或 long  int 或 short int
%o										-- 同上
%s										-- 字符串
关于16进制的%x的相关用法:
# include <stdio.h>

int main(void)
{ 
   
    int x = 47; // 47是十进制

    printf("%x\n", x); // 输出结果是:2f
    printf("%X\n", x); // 输出结果是:2F
    printf("%#x\n", x); // 输出结果是:0x2f
    printf("%#X\n", x); // 输出结果是:0X2F (推荐使用这个)
    
    return 0;
}
scanf() (非重点)

– 通过键盘将数据输入到变量中。

两种方法:
  1. scanf("输入控制符", &输入参数) – 将从键盘输入的字符转化为输入控制符所规定格式的数据,然后再存入以输入参数的值为地址的变量中。具体如下所示:
# include <stdio.h>

int main(void)
{ 
   
    int x;

    scanf("%d", &x);  // &x 表示x的地址,&是一个取地址符
    printf("x = %d\n", x);
    return 0;
}
  1. scanf("非输入控制符 输入控制符", &输入参数) 含有非输入控制符时,用键盘输入时必须加上非输入控制符(即非输入控制符必须原样输入)。
# include <stdio.h>

int main(void)
{ 
   
    int x;

    scanf("m%d", &x);  // 比如m是非输入控制符,这里的 m%d 表示输入是必须是 m数字 (比如 m123),否则会报错
    printf("x = %d\n", x);
    return 0;
}

多个输入时:

# include <stdio.h>

int main(void)
{ 
   
    int x, y, z;

    scanf("%d %d %d", &x, &y, &z);
    printf("x = %d, y = %d, z = %d\n", x, y, z);
    return 0;
}

如果想要根据提示进行键盘输入,可以在前面加上printf("字符串")进行提示:

# include <stdio.h>

int main(void)
{ 
   
    int x;

    printf("m = "); //输入提示,根据该提示在键盘上进行输入。
    scanf("%d", &x); 
    printf("x = %d\n", x);
    return 0;
}
关于scanf()的使用小结(P43 ):
  1. scanf()之前最好先使用printf()提示用户以什么样的方式来输入;
  2. scanf()中尽量不要使用非输入控制符,尤其是不要用\n
  3. 应该编写代码对用户的非法输入做适当处理(非重点);

13. 运算符;

优先级:算数 > 关系 > 逻辑 > 赋值

算数运算符:

+ - * / %(取余数)

关于/的使用:

  1. 两个数都是 int,则商是int,如16/5 == 3
  2. 两个数中有一个为浮点型数据,则商也是浮点型,如16/5.0 == 3.20000

关于%的使用:

运算对象必须是整数,其余数的符号与被除数相同,如下所示:

13%3 == 1 13%-3 == 1 -13%2 == -1

关系运算符:

> >= < <= == !=

逻辑运算符:

||(或) &&(且) !(非)

真||真	   -- 真
真||假	   -- 真
假||真	   -- 真
假||假	   -- 假

真&&真	   -- 真
真&&假	   -- 假
假&&真	   -- 假
假&&假	   -- 假

!真			-- 假
!假			-- 真

注意:

&&左边为假时,右边不执行。

# include <stdio.h>

int main(void)
{ 
   
    int a = 4;
    int m;

    m = (1>2) && (a=7); // 左侧(1>2)是假,所以右侧的 a=7 不会执行。
    printf("m = %d, a = %d\n", m, a);
    
    return 0;
}

||左边为真时,右边不执行。

# include <stdio.h>

int main()
{ 
   
    int a = 4;
    int m;

    m = (3>2) || (a=7); // 左边为真时。右边不执行。
    printf("m = %d, a = %d\n", m, a);

    return 0;
}

关于逻辑运算符的举例:

注意:C语言中 “非零为真,零为假”。就是说只要数值不是0,那就是真;数值是0那就是假。(如下例子所示:)

# include <stdio.h>

int main(void)
{ 
   
    int a = 1;
    int b = 4;
    int m;

    m = (3>2) && (b=7);  // 真&&真==真,3>2是真,b=7是真,所以m=1。
    //m = (3>2) && (b=0); // 真&&假==假,3>2是真,b=0是假,所以m=0。
    
    printf("m = %d, b = %d\n", m, b);  // 真&&真==真,因此m=1。b在上一步被重新赋值,因此b=7.
    
    return 0;
} 
赋值运算符:

= += *= /= -=

++i == i=i+1 == i+=1
附录:一些额外的运算符知识

自增【或自减】

分类:

前自增		--  ++i
后自增		--  i++

异同:

相同点:最终都是 i 值加1
不同点:
	   前自增整体表达式的值是i加1之后的值;
	   后自增整体表达式的值是i加1之前的值;

如下举例所示:
# include <stdio.h>

int main(void)
{ 
   
    int a, b, c, d;
    a = b = 3;

    c = a++; // 后自增
    d = ++b; // 前自增

    printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);

    return 0;
}

/* ------------------------------- 结果:a = 4, b = 4, c = 3, d = 4 ------------------------------- */

关于自增的使用建议:

  1. 尽量不考虑前自增和后自增的差别。
  2. 自增单独成一个语句,不要把它作为一个完整复合语句的一部分来使用(就是说:简单使用,不要和其他乱七八糟的语句混在一块使用)。

比如说:int m = i++ + ++i + i + i++;这种就是垃圾语句,不用去看。

三目运算符

格式:
A ? B : C

等价于:

if (A)
	B;
else
	C;

逗号表达式

格式:
A, B, C, D;

功能:
	从左到右执行;
	最终表达式的值是最后一项的值;
	
比如:
int i;
int j = 2;
i = (j++, ++j, j+2, j-3);

结果是:1

今天的文章C语言学习记录-Class3-编程基础知识分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/82010.html

(0)
编程小号编程小号
上一篇 2024-05-17 10:46
下一篇 2023-08-26 09:11

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注