C#基础表达式语句详解(上)
本节内容:
1.表达式的定义;
2.各类表达式概览;
3.语句的定义;
4.语句详解;
1.表达式的定义:
1.1什么是表达式:
(定义见下图)各类编程语言对表达式的实现不尽相同,但大体上都符合这个定义
什么是编程?运用语句编写程序!

语句是高级语言的语法,编译语法语言和机器语言只有指令(高级语言中的表达式对应低级语言中的指令)语句等价于一个或者一组有明显逻辑关联的指令。
贴近人类思维的编程语言叫做高级语言,贴近计算机硬件的语言叫做汇编语言(低级语言)使用低级语言编程照顾的是硬件,也就是想办法让程序能够让cpu直接读懂,cpu能够读懂的就是指令,所以用低级语言编写的程序就是一大长串的指令(这样我们编写调试的效率都非常低)。编译器的作用是把高级语言编译成cpu能看懂的低级语言。一个比喻:指令相当于我们使用的词汇,语句相当于我们使用的句子。
如何查看高级语言经过编译器编译后产生的汇编语言?项目->最后一个选项卡”xx(项目名)属性”->配置属性(第二个选项卡)->C/C++输出文件->汇编程序输出:带源代码的程序集。(这是打开C语言汇编程序的方法)
如何查看C#经过编译器生成的低级代码呢?

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

算法逻辑的最小(最基本)单元,表达一定的算法意图
因为操作符有优先级,所以表达式也就有了优先级。
语句的作用是什么呀:简而言之:语句是陈述算法思想,控制逻辑走向,完成有意义的动作。
*并不是所有以;结尾的都是语句,比如using System;这是引入名称空间的指令,不是语句。再如:一个类里面的声明:public string Name;叫字段的声明不叫语句。
那什么才是语句呢?语句一定出现在方法体里面的(而不是类体,或者引入名称空间之类的),如main方法体里面的以分号结尾的都是语句。
在程序的源文件夹里面打开bin->debug在这个文件夹的空白处shift+右键可以看到有:在此处打开powershell窗口,点击它可以出现命令输入窗口在这里面可以执行改文件夹里面的exe文件:

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 literal。 Null值(不属于任何一种数据类型)即为一个表达式。
*An anonymous function:匿名方法,返回值为委托
*A Property access:属性访问
*An event access:事件访问
*An indexer access:访问索引器
*Nothing 对返回值为void的方法的调用
*关键部分:
语句详解:

首先可以分为三大类:标签语句;声明语句;嵌入式语句
什么语句可以当做嵌入式语句来使用呢?
详见列表↑横线以上表示初学者也要熟练使用的语句,横线以下的语句相对较高级或少用,暂时用不到;
*Else分支永远都是与离它最近的没有esle配对的if配对。
2.2声明语句:
判断:int x=100;与int x;x=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#基础表达式语句详解(上)的更多相关文章
- C#基础表达式语句详解(下)
书接上文: 4.选择语句:if语句和switch语句 4.1If语句:statement:两种格式:A与B A:If(boolean-expression)embedded-statement(嵌入式 ...
- 基础select语句详解
在数据库操作语句中,使用最频繁,也被认为最重要的是 SELECT 查询语句.我们已经在不少地方用到了 SELECT * FROM table_name; 这条语句用于查看一张表中的所有内容. 而 SE ...
- mysql基础篇 - SELECT 语句详解
基础篇 - SELECT 语句详解 SELECT语句详解 一.实验简介 SQL 中最常用的 SELECT 语句,用来在表中选取数据,本节实验中将通过一系列的动手操作详细学习 SELEC ...
- Linq之查询表达式语法详解
1.闲言碎语 由于项目的需要接触到Linq,刚开始有些不适应,好多概念都很模糊.不过经过一段时间的摸索,慢慢地对Linq有了一个更加深入的了解.在此记录一下备忘. 2.查询表达式语法 执行L ...
- 【转】MySQL用户管理及SQL语句详解
[转]MySQL用户管理及SQL语句详解 1.1 MySQL用户管理 1.1.1 用户的定义 用户名+主机域 mysql> select user,host,password from mysq ...
- (转)总结之:CentOS 6.5 MySQL数据库的基础以及深入详解
总结之:CentOS 6.5 MySQL数据库的基础以及深入详解 原文:http://tanxw.blog.51cto.com/4309543/1395539 前言 早期MySQL AB公司在2009 ...
- 基础拾遗------redis详解
基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...
- 基础拾遗------webservice详解
基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...
- C++框架_之Qt的窗口部件系统的详解-上
C++框架_之Qt的窗口部件系统的详解-上 第一部分概述 第一次建立helloworld程序时,曾看到Qt Creator提供的默认基类只有QMainWindow.QWidget和QDialog三种. ...
随机推荐
- day66_10_10,vue项目环境搭建
一.下载. 首先去官网查看网址. 下载vue环境之前需要先下载node,使用应用商城npm下载,可以将其下载源改成cnpm: """ node ~~ python:nod ...
- day3_7.1
1.python的注释 python中为了使代码更容易被人看懂,提高团队开发效率,可使用注释.代码中的注释不加入编译中. 注释有单行注释,如 #这是一段注释 和多行注释: ''' 这是一行注释 ''' ...
- BZOJ2733/LG3324 「HNOI2014」永无乡 权值线段树合并
问题描述 BZOJ2733 LG3224 题解 对于每个结点建立一棵权值线段树. 查询操作就去查询第 \(k\) 大,合并操作就合并两颗权值线段树. 并查集维护连通性. 同时 STO hkk,zcr, ...
- oracle用户管理, 授权与回收权限
一. 用户管理参数, 0.删除用户: drop user 用户名 [cascade] 当我们删除用户时, 如改用户已创建过数据对象, 那么删除用户时必须加cascade参数, 用来同步删除 改用户的所 ...
- nodejs 连接MySQL后,输出数据带有RowDataPacket、中括号大括号怎么去掉?
var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'localhost', user : ' ...
- 修改gradle中央仓库,加快jar包下载速度
打开gradle项目的build.gradle文件 找到repositories,注释掉mavenCentral(),使用阿里云的仓库地址 repositories { //mavenCentral( ...
- [探究] 用舞蹈链(DLX)解决一类数独问题
考虑精准覆盖问题的本质--我们把行看做决策,把列看做任务,那么其实质就是通过决策来完成任务. 那么我们来考虑数独问题的本质,对于一个\(n^2\cdot n^2\)的数独而言,他的目标函数有四个: 1 ...
- vue+elementui+netcore混合开发
1.VueController.cs using Bogus; using System; using System.Collections.Generic; using System.Linq; u ...
- LeetCode 150:逆波兰表达式求值 Evaluate Reverse Polish Notation
题目: 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. Evaluate the value of an arithm ...
- vue怎么给自定义组件绑定原生事件
下面主要以4个示例Demo演示(示例代码JS引用的Vue CDN),建议小伙伴直接复制示例代码运行查看, 赶时间的小伙伴可直接往下拉,看示例demo4 注:全局或局部注册的组件称为子组件,其中声明的 ...