niucaidi 发表于 2021-7-12 18:22

C语言基础第五课:正向基础

本帖最后由 niucaidi 于 2021-7-12 18:24 编辑

## 正向基础
### 什么是声明变量
```c
//全局变量的声明                        
int a,b,c;    //全局变量的声明                        
void Fun()                        
{                        
      a = 10; //全局变量的赋值               
      b = 20;               
      c = a;               
}                        
```
```c
void Fun()                              
{                              
      int a,b,c;//局部变量的声明                        
      a = 10;   //局部变量的赋值                        
      b = 20;                        
      c = a;                        
}                              

```
总结:声明变量的`宽度`和`存储格式`由`数据类型`决定.计算机什么时候分配内存,取决于变量的作用范围,如果是全局变量,在程序编译完就已经分配了空间,如果是局部变量,只有所在的程序被调用的时候,才会分配空间.`全局变量`如果`不赋初始值`,`默认`是`0`,但局部变量在使用前一定要赋初值.

---------
## C语言的类型转换在汇编中是如何执行的
- **movsx**:先符号扩展,再传送,针对有符号数

反映在C语言中
```c
      char i = 0xFF;               
      short k = 0xFFFF;                        
      int h = 0xFFFFFFFF;               
```

反映再汇编中
```
      MOV AL,0XFF
      MOVSX CX,AL
      MOV AL,0X80
      MOVSX CX,AL
```

- **movzx**:先用零扩展,再传送,针对无符号数

反映在C语言中
```c
      unsigned char i = 0xFF;                        
      unsigned short k = 0x00FF;                                                
      unsigned int h = 0x00000000FF;                        
```

反映再汇编中
```
      MOV AL,0XFF
      MOVZX CX,AL
      MOV AL,0X80
      MOVZX CX,AL
```
-----
### C语言表达式的特点
1. 表达式无论多么复杂都只有一个结果
2. 不与程序中其他元素有任何关联的表达式也可以编译通过,但并不生成汇编代码,表达式只有与需接受赋值的对象或其他流程控制语句配合使用才有意义
3. 如果表达式中有宽度不同的变量,结果的宽度将与宽度最大的变量一致
4. 如果表达式中同时存在有符号数和无符号数,表达式的运算结果将转换为无符号数

-----
### C语言循环体
1. while循环
```c
int main()
{
          int i = {0};
          int t = 0;
          while(t<10)
          {
                  printf("%d\n",i);
          }
}
```
2. do...while循环
```c
int main()
{
          int i = {0};
          int t = 0;
          do{
                  printf("%d\n".i);
          }while(t<10);
}
```
3. for循环
```c
int main()
{
          int i = {0};
          int t = 0;
          for(t = 0;t < 10;t++)
          {
                  printf("%d\n",i);
          }
}
```
   
- `continue`:跳过本次循环,进入下一次循环
- `break`:结束整个循环

### 结论:
- 三个循环体可以互相转换,任何一种循环可以实现的功能都可以用另外两种循环实现
- 三个循环体在正向编程中难易程度从难到易排序为:1.do..while、2.while、3.for
- 三个循环体的执行效率从高到低排序依次为:1.do..while、2.while、3.for


本节作业:

```
1、将两个变量的值交换.                                                
                                                
2、将一个数组中的数倒序输出.                                                
                                                
3、找出数组里面最大的值,并返回                                                
                                                
4、将数组所有的元素相加,将结果返回                                                
                                                
5、将两个等长数组相同位置的值相加,存储到另外一个等长的数组中                                                
                                                
6、写一个函数int prime(int x),如果x是素数返回值为1,否则返回0。                                                
                                                
7、俩俩比较数组的值,将最大的一个存储到数组的最后一个位置                                                
                                                
8、编写程序实现一个冒泡排序的算法.                                                
                                                
9.判断数组是否是对称的,如果是返回1,不是返回0.
```

niucaidi 发表于 2021-7-15 21:09

detianda 发表于 2021-7-15 20:36
练了几个月,竟然看不懂,咋办呢

正常的,这个笔记是从逆向的角度加深对C语言的理解,研究的是正向学习C语言一般不会研究的问题,而且也只是笔记而已,算不上完整的教程。不用沮丧,一起加油

骄阳似我 发表于 2021-8-8 19:37

niucaidi 发表于 2021-7-15 21:09
正常的,这个笔记是从逆向的角度加深对C语言的理解,研究的是正向学习C语言一般不会研究的问题,而且也只 ...

这个我看的懂,但是我对于学习C语言没有点进步的思路,就是说看见一个案例我再去看,再去分析怎么写,一=就是不知道能怎么做才能再进一步,没有一点的学习方向

傻小猪 发表于 2021-7-12 19:18

感谢楼主的分享,当做复习。

MY木头 发表于 2021-7-12 20:01

感谢楼主

bdrdc 发表于 2021-7-12 20:11

这个不错,好好研究研究.......

liangqz 发表于 2021-7-12 20:22

学习学习

gnn347 发表于 2021-7-12 21:01

认真学习,谢谢分享!

xinunil 发表于 2021-7-12 21:10

又温习了一遍,大学的东西都忘干净了,感谢

appleding 发表于 2021-7-12 21:51


非常好!GOOD!!辛苦了

nip777 发表于 2021-7-13 00:42

感谢楼主分享,收藏学习。

1983 发表于 2021-7-13 01:43

真的是就当复习,但是内容有点点短
页: [1] 2 3 4 5 6 7
查看完整版本: C语言基础第五课:正向基础