C#基础表达式语句详解(上)

本节内容:

1.表达式的定义;

2.各类表达式概览;

3.语句的定义;

4.语句详解;

 

1.表达式的定义:

1.1什么是表达式:

(定义见下图)各类编程语言对表达式的实现不尽相同,但大体上都符合这个定义

什么是编程?运用语句编写程序!

 C#基础表达式语句详解(上)

语句是高级语言的语法,编译语法语言和机器语言只有指令(高级语言中的表达式对应低级语言中的指令)语句等价于一个或者一组有明显逻辑关联的指令。

 

贴近人类思维的编程语言叫做高级语言,贴近计算机硬件的语言叫做汇编语言(低级语言)使用低级语言编程照顾的是硬件,也就是想办法让程序能够让cpu直接读懂,cpu能够读懂的就是指令,所以用低级语言编写的程序就是一大长串的指令(这样我们编写调试的效率都非常低)。编译器的作用是把高级语言编译成cpu能看懂的低级语言。一个比喻:指令相当于我们使用的词汇,语句相当于我们使用的句子。

如何查看高级语言经过编译器编译后产生的汇编语言?项目->最后一个选项卡”xx(项目名)属性”->配置属性(第二个选项卡)->C/C++输出文件->汇编程序输出:带源代码的程序集。(这是打开C语言汇编程序的方法)

如何查看C#经过编译器生成的低级代码呢?

 C#基础表达式语句详解(上)

在开始菜单搜索栏输入”visual”找到visual Studio Tools然后打开ARM兼容工具命令提示,在命名行窗口中输入ildasm就会弹出一个工具窗口,点击文件,添加C#程序源文件夹下的exe可执行文件,双击对应的程序就会显示其经编译器生成的低级语言编写的指令集。

 

1.2C#语言表达式的定义(见下图)

 C#基础表达式语句详解(上)

算法逻辑的最小(最基本)单元,表达一定的算法意图

因为操作符有优先级,所以表达式也就有了优先级。

语句的作用是什么呀:简而言之:语句是陈述算法思想,控制逻辑走向,完成有意义的动作。

*并不是所有以;结尾的都是语句,比如using System;这是引入名称空间的指令,不是语句。再如:一个类里面的声明:public string Name;叫字段的声明不叫语句。

那什么才是语句呢?语句一定出现在方法体里面的(而不是类体,或者引入名称空间之类的),如main方法体里面的以分号结尾的都是语句。

在程序的源文件夹里面打开bin->debug在这个文件夹的空白处shift+右键可以看到有:在此处打开powershell窗口,点击它可以出现命令输入窗口在这里面可以执行改文件夹里面的exe文件:

 C#基础表达式语句详解(上)

2、各类表达式概览

2.1C#语言中表达式的分类

*A value,Every value has an associated type,任何能得到值的运算(回顾操作符和结构类型)

表达式经过运算之后能够产生一个值而这个值又具有自己的数据类型,所以说我们也把表达式所产生的值(很多情况下与操作符有关系)的数据类型称为这个表达式的数据类型。例如:这有一个布尔类型的表达式,指的就是这个表达式在经过运算之后所得到的数据是布尔类型的:

var d = 3 < 5;

            Console.WriteLine(d);

            Console.WriteLine(d.GetType().FullName);

赋值表达式的值与赋值操作符左边的值相等;

*A variable,Every variable has an associated type,

*A namespace

*A Type

*A method group;例如Console.WriteLine。这是一组方法,重载决策决定具体调用哪一个。

比如Console.WriteLine(),不写参数的时候该表达式返回的是一组方法(19个重载方法),

通过”()”操作符调用方法。

*A NULL literalNull值(不属于任何一种数据类型)即为一个表达式。
*An anonymous function:匿名方法,返回值为委托

*A Property access:属性访问

*An event access:事件访问

*An indexer access:访问索引器

*Nothing 对返回值为void的方法的调用

*关键部分:

语句详解:

C#基础表达式语句详解(上)

首先可以分为三大类:标签语句;声明语句;嵌入式语句

什么语句可以当做嵌入式语句来使用呢?

详见列表↑横线以上表示初学者也要熟练使用的语句,横线以下的语句相对较高级或少用,暂时用不到;

*Else分支永远都是与离它最近的没有esle配对的if配对。

 

2.2声明语句:

判断:int x=100;int xx=100;是不是一回事?不是一回事int x=100;这种写法叫做声明变量的时候追加了变量的初始化器”=100”;另外一种写法”int x;”叫做声明的时候没有初始化而在后面对变量进行了赋值。前面是一步操作后面是两步操作。

一般不会int x,y,z;地定义变量,这样写会降低程序可读性。

  int[] myArray={1,2,3};等号右边的叫数组的初始化器。

*常量声明语句

常量:在声明和初始化之后值不能改变的量。

    const int x = 100;格式为

常量在声明的同时必须赋值(后面跟上初始化器),不能分开。

也可以理解,如果错过了初始化的机会再给它赋值,语法上就不允许。

 

2.3表达式语句

语句表达式:简而言之可以形成语句的表达式;

*即表达式后面加上分号(;)就是一条语句!

*不是所有的表达式都可以作为语句来使用。

*那么哪些表达式可以作为语句来使用的?

①调用表达式(即用”()”调用方法的表达式)补充:Console.WritLine这是成员访问还不是方法调用,要加上圆括号(方法调用操作符)才是方法调用Console.WritLine();

②对象创建表达式:就是用new操作符构成的表达式,补充:new操作符会创建一个对象并调用这个对象的构造器,比如new Form();虽然没有变量引用它,很快就会被垃圾收集器把这个对象回收,但是这并不妨碍它成为一个可以编译过去的语句、

③赋值表达式、

前置的自增表达式、后置的自增表达式,后置的自减表达式,前置的自减表达式。(x++x----x++x

Await表达式(先不讲)

*表达式值的丢弃:像方法调用表达式;Add(3,4);自增表达式:x++;他们本身都是有值的如果没有变量引用他们表达式本身的值就会被丢弃。那为什么C#语言会允许这样的现象产生呢?如果方法是这样的:

 static double Add(double a,double b)

{

    double result = a + b;

    Console.WriteLine("Result={0}",result);//事件1打印结果

    return a+b;//事件2返回结果

}

我们在main函数中这样调用它Add(3,4);则会输出Add方法里面相关输出语句的内容。这样的好处是:目前我只关心的是把这个值打印出来,至于这个值我并不想存储它。

不过平时写程序要尽量避免写这样的方法,因为这样一个方法做了两件事,我们写程序要追求一个原则:single responsibility叫做单一职责原则:即一个方法尽量只做一件事情!

*当一个方法做两件事情的时候,有一件事情一定是它的主功能,另一件事情是副功能,这样在未来无论哪个功能需求上发生了变化我们都要回来改这个方法,而如果有别的方法还调用这个副方法的话(所以要求低耦合),这个改动就会引入意想不到的bug,这时候的代码设计是有问题的。所以说写程序的时候要避免:一个方法里面有多个功能!

 int x = 100;

            int y = 200;

            x + y;

这里x+y语句是毫无意义的,C#不允许,而C语言允许(如100;X;Y;这些毫无意义的语句都允许),每一种语言对语句的定义都不完全相同。所以说C#语言对语句的定义要严格得多。

 

2.4块语句(block

块语句:用于只允许使用单个语句的上下文中编写多条语句。(可以想象block是一个语句的容器,在block这一条语句里面可以容纳多条语句)

格式:block:

{

Statement-list;(可以不写但是大多时候要写)(意味着C#里面的所有语句都可以写在里面)

}

举例:

namespace dmeo5块语句

{

    class Program

    {

        static void Main(string[] args)

        {

        }

    }

}

上面程序里面有很多花括号,都是块语句吗?不是,最外层的{}表示名称空间的名称空间体;中间的{}表示Program类的类体;最内层的{}表示main方法的方法体。

那我怎么知道哪些是块语句呢?语句是在方法体里面的,当看到方法体里面有{}就是块语句。

*块语句无论什么时候都会被编译器当做一条语句来看待,无论一个块语句里面容纳了多少子语句。

*编译器会认为块语句是一条完整的语句,就是说写完块语句之后不用在{}后面加;.

块语句举例:

 static void Main(string[] args)

        {

            {

                int x = 100;

                if (x>80)

                {

                    Console.WriteLine(x);

                }

            }

        }

{}花括号内便是块语句,块语句中可以是C#语言的全部三种语句,比如标签语句:

 hello: Console.WriteLine("Hello world");这就是一个标签语句,表示

Console.WriteLine("Hello world");hello标记了。可以使用goto来跳转到指定标签的语句中:

hello: Console.WriteLine("Hello world");

            goto hello;//死循环

*使用快捷键Ctrl+]可以在一对花括号间来回跳动。

块语句一般与都是与if语句,for语句和while语句一起用的,不要乱用

*什么变量的作用域?在块语句之前和之后声明的变量块语句都是可以访问它的,而在块语句声明的变量,出了块语句之后就不能被访问了。比如:

{

Int y=100;

Console.WriteLine(y);

}

Y的作用域准确来讲是在这个块语句里面(在变量y声明之后)

剩下内容见下期。

C#基础表达式语句详解(上)

上一篇:Review on the State of Charge Estimation Methods for Electric Vehicle Battery


下一篇:Code Review最佳实践