C语言与自然语言和C语言中的常量/变量

195 阅读8分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

@TOC

3 C语言和自然语言

C语言是一种语言,自然语言也是一种语言,这两者之间的联系是:自然语言是有逻辑的,C语言也是有逻辑的,然后C语言就是在模仿自然语言的逻辑。其实所有编程语言都是在模仿自然语言,哪门语言模仿的最像,哪门语言就最容易上手。

  • 下面我们从一个数学中的常识来理解这种关系:在自然语言中我们思考7/3 -7/3 7/-3,这个除法,在自然语言中它暗指的逻辑是这样的:被除数除以除数等于商,除不尽的话会有余数,所以我们知道7/3商为2余数为1,-7/3商为-2余数为-1,7/-3商为-2余数为1,求余运算,余数的符号同被除数,C语言其实也在模仿这种逻辑,只不过是在C语言中无法同时表示商和余数两个概念,所以将商和余数分开来进行表示,如下所示:
#include<stdio.h>
int main()
{
    printf("7/3的商为:%d,-7/3的商为:%d,7/-3的商为:%d\n", 7/3, -7/3, 7/-3);
    printf("7%3的余数为:%d,-7%3的余数为:%d,7%-3的商为:%d\n", 7%3, -7%3, 7%-3);
    return 0;
}

运行结果: 3

  • 计算机语言和自然语言并不是冲突的,计算机语言其实是在争相模仿自然语言,自然语言在计算机中无法表达的时候,就出现了规则,这种规则就是语法,虽然从语法的角度,计算机语言跟自然语言有了差距,但是逻辑却是相同的。例如上述一点计算机无法同时表示商和余数,故出现了以上两种表达。

3.1 什么是程序

程序一词来自生活,通常指完成某些事务的一种既定方式和过程在日常生活中,可以将程序看成对一系列动作的执行过程的描述。 生活中: 3.1

计算机中:为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合 3.1-2

3.2 算法和流程图

3.2.1 算法和流程图简述

  • 算法:解决问题的具体方法和步骤。算法是有优劣之分,在计算机中常用时间复杂度和空间复杂度来衡量的,在后序课程讲算法的时候会有详细的讲解。
  • 如何来描述算法呢?比如,我现在要计算一个长方形的面积。我就要用自然语言去描述它。 算法如下:
    • 1.接受用户输入的长方形长度和宽度两个值;
    • 2.判断长度和宽度的值是否大于零;
    • 3.如果大于零,将长度和宽度两个值相乘得到面积,否则显示输入错误;
    • 4.显示面积。

其实上述表达方式也是自然语言的一种表达方式。 为了更易于表达清楚,常采用流程图的方式: 3.2.1

  • 流程图是算法的一种图形化表示方式。流程图直观、清晰,更有利于人们设计与理解算法。

  • 它使用一组预定义的符号来说明如何执行特定任务。 3.2.1-2

  • 这里需要注意的是流程是有高下之分的,也就是算法是有高下之分的。

  • 一个好用的网络画流程图的网址:www.processon.com

3.2.2 请用流程图 将a,b,c中最大值放到max中并输出。

如下图所示: 3.2.2

4.常/变量与数据类型

4

当我们用计算机语言来描述世界的时候,比如一个人的性别,身高,体重,收入,就需要变量来存储,变量之间不仅需要名字来识别,还需要类型来进行限定。

4.1 C语言中的关键字

关键字,也叫保留字。已经被C语言赋予了特殊的意义,所以我们既要研究其特殊的意义,也要跟其不发生冲突

autobreakcasecharconstcontinuedefaultdo
doubleelseenumexternfloatforgotoif
intlongregisterreturnshortsignedsizeofstatic
structswitchtypedefunionunsignedvoidvolatilewhile

4.2.变量

因为世界上好多东西的不是一直不变的,比如身高,收入等,故将这种会变化的值就需要使用变量来储存,与之相对应,常量就是一直不会变的量比如圆周率:π。

4.2.1.变量的定义

类型 变量名;

4.2.2.变量的命名规则:

  • 1.变量名可以由字母、数组和_(下划线)组合而成。// a-z A-Z 0-9 _
  • 2.变量名不能包含处_以外的任何特殊字符,如:%、#、逗号、空格等。
  • 3.变量名必须以字符或_(下划线)开头。
  • 4.变量名不能包含空白字符(换行符、空格和制表符成为空白字符)。
  • 5.C语言中的某些词(例如int和float等)称为保留字,具有特殊意义,不能用作变量名
  • 6.C语言区分大小写,因此变量price与变量PRICE是两个不同的变量 如下名字是合法的
int a#b; //违反上述第一条原则
int a$b; //违反上述第一条原则 
int ab;
int Ab; //这两个定义是可以的,因为上述第六条所说C语言对大小写是敏感的
int _a_b_c; //这样定义是可以的,因为上述第一条和第二条都指出下划线_是可以是使用的
int 1var; //这样定义是错误的,因为违反来上述第三条原则
int -var; //这样定义是错误的,因为违反了上述第二条原则,只能使用下划线,不可以使用中划线和上划线
int a-b; // 这样定义是错误的,违反上述第二条原则,不可以使用中划线
int a?b; // 这样定义是错误的,违反上述第一条原则,不可以使用?
int _ab; // 这样定义是正确的,按照上述第三条原则,_可以开头
int int; // 这样定义是错误的,违反上述第五条原则,不能使用关键字

通过上述6条原则,可以归纳出一个结论:变量名的组成规则是 数字(0-9),字母(a-z A-Z),下划线(_),不以数字打头,并且大小写敏感,不能用关键字

4.2.3.交换两个变量的内容

#include<stdio.h>
int main()
{
    int a = 8;
    int b = 6;
    printf("交换前:a=%d, b=%d\n", a, b);
/*
    a = b;
    b = a;
    printf("交换后:a=%d, b=%d\n", a, b);
*/
    // 注意不要犯上述错误
    int c = a;
    a = b;
    b = c;
    printf("交换后:a=%d, b=%d\n", a, b);
}

运行结果: 4.2.3

其实从上述计算机交换两个值需要一个变量来看,计算机其实并没有人一样智能,计算机的唯一特点就是计算超级快。

4.2.4.驼峰命名法

骆驼式命名法就是当变量名或函式名是由一个或多个单词连接在一起,而构成的唯一识别字时,第一个单词以小写字母开始;第二个单词的首字母大写或每一个单词的首字母都采用大写字母,例如:myFirstName、myLastName,这样的变量名看上去就像骆驼峰一样此起彼伏,故得名。 骆驼式命名法的命名规则可视为一种惯例,并无绝对与强制,为的是增加识别和可读性。 例如:

int myBookPrice;
int studentNum;

例外:

int my_book_price;
int student_num;

linux原生代码就是使用上述规则进行命名的。

4.3.内存模型

4.3.1.物理基础

对于32机而言,内存模型线性的,这是硬件基础。左边表示十六进制的访问地址,右边分别表示寻址的最小单元Byte和Byte的最小单位bit。

  • 1Byte=8bit 通常称为1个字节等于8个比特
  • 1KB=1024Byte
  • 1MB=1024KB
  • 1G=1024MB
  • 1T = 1024G 计算机是以字节为单位进行编止,一个Bit是没有地址的 0xFFFF FFFF 是4G - 1,2的32次方等于4G
  • 如下图: 4.3.1

4.3.2.CPU读写内存

CPU在运作时,读取内存数据,首先要指定存储单元的地址。就是要确定读写哪段数据。即要明确三件事情。

  • 存储单元的地址(地址信息)
  • 器件的选择,读or写(控制信息)
  • 读写的数据(数据信息)

4.3.2.1.地址总线

其中CPU通过地址总线要寻址,指定存储单元。可见地址总线上能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址。有10根地址总线,就能传送10位二进制数据,也就是2的10次方。最小为0,最大为1023.也就是2的n次方 = 最大传输n=多少地址总线 CPU的地址总线的宽带决定了CPU的寻址能力。

4.3.2.2.数据总线

CPU与内存或其他器件实行数据传达是通过数据总线来进行的。8根数据总线一次可以传送8位二进制数据。16根数据总线一次可以传2个字节。 数据总线的宽带决定了CPU和外界的数据传输速度。

4.3.2.3.控制总线

CPU对外部部件的控制是通过控制总线来进行的。控制总线是个总称,控制总线是有不同的控制线来集合的。有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。 所以,控制总线的宽带决定了CPU对外部部件的控制能力。