您的位置:首页 > 编程语言 > C#

C#成神之路<7> 对C#语句的加深理解

2016-02-03 16:24 155 查看
1、编程语言基本构件块

所有编程语言构建的底层基础:

程序>语句>表达式>操作数和运算符

翻译 :程序有一个或多个语句您构成,语句由一个或多个表达式构成,表达式由一个或多个运算符结合在一起构成。

(1)操作数和运算符

操作数:只是信息,与其关联的信息存储在一个变量中。

运算符:指定应该对操作数进行的计算。

(二元运算符、一元运算符的概念此处略)

(2)表达式

表达式将一个或多个操作数与他们关联的运算符作为一个整体对待。

(3)语句

程序语句是以分号结尾的一个或者多个表达式。

(4)运算符优先级

两个数学运算符具有相同优先级的时候按照从左向右处理。

左结合:通过从左至右处理解析关系的运算符。

右结合:从右至左处理杰西关系的运算符。

EXE:数学运算符是左结合,而赋值运算符是右结合。

2、变量的定义和使用

(1)从编译器的角度来理解定义变量

I.初步语法检查

VS检查语句是否会有语法错误。

II.符号表检查

符号表是VS内部表,用来跟踪需要在程序中使用的数据。

简化的符号表包括:

ID(定义的变量名)、数据类型、作用域、Ivalue(变量所在的内存位置)。

在这一步骤中,VS扫表ID列观察是否定义了名为i的变量,以确保在同一个作用域中有唯一的ID值。定义了之后,会有Ivalue和rvalue的定义。lvalue是内存地址,rvalue是注册表值,即存储在变量中的实际值。(利用赋值运算符进行赋值,完成rvalue的定义)

III.定义变量

在这一个步骤中,VS向操作系统发出寻找足够内存的请求。操作系统为变量需找足够的内存。操作系统把消息发给Windows Memory Manager(内存管理器)。内存管理器扫描他空闲的内存列表,找到空闲内存之后,向VS发出消息。VS接受到消息,吧该内存地址存入符号表中的Ivalue中。

在此之后可以说定义了变量i,当且仅当某个变量被定义时,才会将内存地址赋予表中该变量的Ivalue列。而声明变量,符号表中的Ivalue是不包含内存地址的。这是定义和声明变量的差别!!!!

(2)从编译器的角度来理解使用变量

I.语法检查

VS必须先确保C#语句语法正确。

II.符号表检查

在符号表中确认事先定义好的i变量。(是否定义,是否在作用域范围内)

III.获取变量的Ivalue

VS需要知道在何处存储值,所以需要查找符号表中的Ivalue。

然后符号表中的rvalue也会跟着进行改变。

3、 Bucket Analogy

(桶模拟)

I.桶的Ivalue表明从何处找到内存中的桶。

II.桶的rvalue表明存储在桶中的数据。

III.条目的数据类型表明桶的空间。

4、程序错误的类型

(1)语法错误

(2)语义错误

(3)逻辑错误

5、VS调试器详解

(1)调试过程

检测->稳定->隔离->纠正

并且简化重复的调试工作。

(2)调试器使用详解

I.设置断点

在断点处,程序会暂停,所以在断点处可以用调试器来检查各种程序变量的状态。

F9

II.断点分析变量

到达断点的时候VS回找到Source窗口并且显示设置断点的行。设置断点的行在程序运行的时候背景颜色从红色改成黄色。为了查看程序执行到断点的可见变量,选择Debug->Windows->Local(调试,窗口,局部变量)。

局部变量窗口用来分析相对于当前方法的局部作用域的变量。

III.单步调试程序

F10会逐步向下检查程序,逐行检查。

6、防御代码

防御策略:编写的代码需要让他人易于理解。

(1)使用程序注释

程序注释是程序中帮助读者理解代码的消息。

(分为单行注释和多行注释)

(2)使用有意义的变量名

(3)避免使用幻数

常量是程序运行时不能改变值的变量。符号常量是程序中名称反映功能的常量,约定符号常量全部以大写字母表示。通常在他们出现的类的最上方定义。(const 用于定义该数据类型的常量)

幻数:不知其代表的具体意义的数字。

综上,虽然都是一些最为基础的,但是其中加入了个人理解,对基础的东西又有了更清晰更深刻的认识。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息