第3章. 变量与表达式
在讲本章前,我们先来看一下一个数学公式,y = x + 1,这个式子几乎包含了本章的所有知识点。其中x、y为变量,1为常量,+为算术操作符,=为赋值操作符,x+1为公式,y=x+1为表达式。
3.1. 数据类型
在数学中,我们把数字分为整数、实数、虚数、复数等;在生活中,我们也会把物品分类,如生活用品、汽车、银行等。在计算机语言中,数据也是有类型的。这里我们先谈论简单的数据类型。
A、整数类型
在C#中表示整数的类型很多,使用最多的整数类型是int。他们之间的不同点是表示范围和长度不同。具体见下表
类型 |
允许的值 |
sbyte |
-128 – 127 |
byte |
0 – 255 |
short |
-32768 – 32767 |
ushort |
0 – 65535 |
int |
-2147483648 – 2147483647 |
uint |
0 – 214967295 |
long |
-9223372036854775808 – 9223372036854775807 |
ulong |
0 – 18446744073709551615 |
在选择整数类型时要尽可能选择满足数据要求,并且尽可能的选择数据区间小的整数类型。比如表示一个人的年龄,选择byte会比选择int更好。
有些变量前面的“u”是“unsigined”的缩写,这些数据类型中不能包含负数。
B、实数类型
如果想表示的数字带有小数点,就不能用整数类型来表示了。这时我们需要用实数类型来表示,也称浮数类型。按照小数点的精度,我们可以把实数类型为float,double,decimal。
C、字符类型
字符类型用char表示,它可以表示一个字或标点符号,如:’a’,’8’,’(‘,’中’,’ は’等单字节或双字节的字。
D、字符串类型
一个或多个字符类型组合在一起就是字符串类型,用string表示一组字符。如“0”,“Hello World!”,“天气不错”等。
E、布尔类型
在生活中我们经常对某个疑问进行“yes”和“No”或“是”和“不是”的回答,在数学中我们对判断会作出“对”和“错”的回答。在回答同一个疑问的时候,我们可能会表达同样的意思,可是表达方式会有很多种。比如“今天天气好吗”,可能得到回答“是的”,“是”,“Yes”,“当然了”等等。为了在计算机语言中规范这种表达,我们把结果是肯定的用“true”表示,把结果是否定的用“false”来表示。
3.2. 变量和常量
在y = x + 1的式子中,假设x、y为整数类型,那么x和y的取值并不是固定的,当x的值发生变化时,y的值也会随着变化。我们称这样的数据为变量。
A、变量的定义
在C#语言中,变量必须先定义后再使用,变量的定义规范如下:
以下是变量定义的一些例子:
string name; //定义一个变量,表示姓名
char sex; //定义一个变量,表示性别
int age; //表示年龄
float height; //表示身高
float weight; //体重
bool isMarried;//是否结婚
string remark; //备注
可以把相同数据类型的变量赋值在一条语句上体现,如
B、 变量的命名规则
和在生活中给一个小孩取名肯定会遵循一定的规则一样,在C#中,变量的取名也有一定的规则。
基本的命名规则如下:
n 变量名的{dy}个字符必须是字母、下划线 _ 或 @。
n 其他字符可以是字母、下划线或数字。
n 命名不能与C#中的关键字相同。
由于C#是与区分字母的大小写的,所以给变量命名时还需遵循一些常见的规范,具体见前面第二章的“代码书写规范”。
C、 变量的赋值
变量的赋值是给定义好的一个变量取值,例子如下:
在C#中,赋值符号是=,它和数学中的等于号意思不一样,赋值符号的意思是把右侧的值赋予左侧的变量。
赋值时一定要把数据类型赋值给相应变量类型。以下赋值是错误的:
name = 朱明明; //错误,字符串类型的取值需要用双引号
sex = "boy"; //错误,无法把一个字符串赋值给字符
age = 12.1; //错误,无法把一个实数赋值给整数变量
isMarried = "Yes"; //错误,布尔类型只能在true 和false之间取值。
变量在赋值前一定要先定义,当然可以把变量的定义和赋值写在一条语句上,如:
(1) 在目录C:\Code\Chapter3\下创建一个新的控制台应用程序OutputStudent。
(2) 修改Program.cs代码如下:
static void Main(string[] args)
{
string name;
double height, weight;
name = "任小虎";
height = 1.67;
weight = 50.0;
int age = 21;
Console.WriteLine("{0}同学{1}岁,身高{2}米,体重{3}公斤。", name, age, height, weight);
Console.ReadKey();
}
(3) 运行代码,结果如图3-1所示。
图3-1
示例的说明
Console.WriteLine语句中我们用占位符{0}代表字符串后的{dy}个参数name,{1}代表age,{2}代表height,{3}代表weight。Console.ReadKey()的作用是暂停代码运行,等待用户按下一个按键。
D、转义符
上面提到字符串变量的值都是放入双引号之内的,双引号本身在C#中有特殊的含义,它代表字符串的开始或者结束。那么,如果想在字符串内容中表示双引号怎么做呢?我们先看以下表示方法是否正确:
答案是错误的,计算机会认为这里有两个字符串"小明说:"和"说完就走了",中间放置了计算机无法认识的字符’好的’。所以这样的表示方法是错误的。
一般我们用\”代表内容中的双引号,所以上面例子的正确表示方法为:
\代表的是转义符。同样,还有其他一些符号需要使用转义符,见下表
排除双引号,如果某个字符串中,出现需要转义的字符较多,为了使字符串的表达更简洁明了,我们可以在字符串前面加上符号@,表示该字符串内所有需要转义的字符都代表字符本身。如文件地址可以采用如下2种表达方式:
E、 常量
在表达式中,如果直接以内容的形式出现的值我们成为常量。如y=x+1中的1,如Console.WriteLine(“Hello world”)中的”Hello World”。
3.3. 表达式
3.3.1. 算术操作符
运算符 |
读法 |
类别 |
示例 |
结果 |
+ |
加 (连接) |
二元 |
z = x + y; |
如果是数字,z的结果是x和y的和; 如果是字符串,z是x和y字符串的连接 |
- |
减 |
二元 |
z = x – y; |
z的值是x和y的差 |
* |
乘 |
二元 |
z = x * y; |
z的值是x和y的积 |
/ |
除 |
二元 |
z = x / y; |
z的值是x除以y的结果 |
% |
求余 |
二元 |
z = x % y; |
z的值是x除以y后所得的余数 |
+ |
正 |
一元 |
z = +x; |
z的值是x |
- |
负 |
一元 |
z = -x; |
z的值是x的相反数 |
以上是C#中简单的算术操作符,大部分操作符在与数学中的表达方式很类似。如果x=4;y=3;那么执行语句z=x+y;后,z的值为7,执行z=x%y后的结果是1。
其中+符号比较特殊,它可以应用在两个字符串间的操作。比如x=”你好,”;y=”中国!”;那么执行语句z=x+y后,z的值为”你好,中国!”。其他运算符不能用作字符串的处理。
在处理数据时,经常会用到一种操作,就是把某个数字自增1或者自减1,虽然可以用+和-来达到效果,C#中定义了一个更简便的符号,见下表。
对与++x或者x++,最终结果,都会使x自增1,等同与x=x+1;操作符放在前面和后面的区别在于把这个结果赋值时会有所不同。
l z=++x;等同与 x=x+1; z=x;
l z=x++;等同与z=x;x++;
(1) 在目录C:\Code\Chapter3\下创建一个新的控制台应用程序SimpleComputer。
(2) 修改Program.cs代码如下:
static void Main(string[] args)
{
Console.WriteLine("这是一个简单的计算器。");
Console.WriteLine("功能:任意输入个数字,能求出这个数字的和、差、积、除和余数。");
Console.Write("请你输入{dy}个数字:");
double number1 = Convert.ToDouble(Console.ReadLine());
Console.Write("请你输入第二个数字:");
double number2 = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("两个数相加得{0}", number1 + number2);
Console.WriteLine("两个数相减得{0}", number1 - number2);
Console.WriteLine("两个数相乘得{0}", number1 * number2);
Console.WriteLine("两个数相除得{0}", number1 / number2);
Console.ReadKey();
}
(3) 运行代码,结果如图3-2所示。
图3-2
3.3.2. 赋值操作符
之前例子中的运算符=就是赋值运算符,它的作用是把符号右侧的值赋给符号左侧的变量。除了简单的=赋值符,还有一些+=、-=、*=、/=、%=。使用方式为y+=x;,他的作用与y=y+x;一样,是把符号左侧的值加上右侧的值再赋给符号左侧的变量。+=运算符还可以用于字符串操作。
3.3.3. 逻辑操作符
在生活中,经常会遇到比较两个数字的大小,如张三的年龄比李四大,买火车票时座位的价格比卧铺便宜等。那么如何用C#语言来描述两个数据的大小关系呢?这是我们可以用到逻辑操作符。见下表
运算符 |
读法 |
类别 |
示例 |
结果 |
== |
等于 |
二元 |
z = x==y; |
如果x等于y,那么z的值为true,否则为false |
!= |
不等于 |
二元 |
z =x!=y |
如果x不等于y,那么z的值为true,否则为false |
< |
小于 |
二元 |
z =x<y; |
如果x小于y,那么z的值为true,否则为false |
> |
大于 |
二元 |
z =x>y; |
如果x大于y,那么z的值为true,否则为false |
<= |
小于等于 |
二元 |
z =x<=y; |
如果x小于等于y,那么z的值为true,否则为false |
>= |
大于等于 |
二元 |
z =x>=y; |
如果x大于等于y,那么z的值为true,否则为false |
表中x==y的运算结果为一个布尔值,然后赋给布尔变量z。其中==和!=可以用在字符串的比较中,其他符号则必须用在数字的比较中。
处理布尔值时,还会用到一些逻辑运算符,见下表
运算符 |
读法 |
类别 |
示例 |
结果 |
! |
非 |
一元 |
z = !x; |
如果x为true,那么z为false,否则为true |
& |
与 |
二元 |
z =x&y |
如果x和 y都为true,那么z的值为true,否则为false |
| |
或 |
二元 |
z =x|y; |
如果x或y为true,那么z的值为true,否则为false |
^ |
异或 |
二元 |
z =x^y; |
如果x和y只有一个为true,那么z的值为true,否则为false |
&& |
与 |
二元 |
z =x&&y; |
同& |
|| |
或 |
二元 |
z =x||y; |
同| |
&、|、^的运算规则如下表
在上面的表达中,我们发现&&、||和&、|的运算结果xx相同,但是运算的过程有重要区别,&&和||比&和|性能比较好。当运算符的两侧都是表达式时,如 x>y & a<=b,当x>y是false时,实际整个表达式肯定是false了,但是计算机还会去运算a<=b;而使用x>y&&a<=b时,如果x>y是假,那么计算机直接就断定这个表达式为假,不会运算a<=b的结果。
3.3.4. 逻辑赋值运算符
逻辑赋值运算符的语法和普通赋值符的语法类似。
3.3.5. 运算符的优先级
括号可用于忽略优先级顺序。