C#变量
变量可以理解为是我们程序可以操作的内存区域的名称,在 C# 中每个变量都有自己特定的类型,这个类型确定了变量所占内存的大小、布局、取值范围以及可以对该变量执行的操作。
可以将变量当作一种通过符号(变量名)表示某个内存区域的方法,变量的值可以更改,并且可以多次重复使用。C# 中的基本变量类型可以归纳为以下几种:
声明变量
C# 中声明变量的语法格式如下所示:
data_type variable_list;
其中,data_type 为变量的类型,可以是 C# 中任何有效的数据类型,例如 char、int、float 等,也可以是我们自定义的数据类型;variable_list 为要声明的变量名称(标识符),variable_list 中可以包含多个变量名称,每个变量名之间使用逗号进行分隔,这样我们就可以同时定义多个变量,如下所示:
int i, j, k; double a; char b, c; float d;
C# 中变量的名称并不是可以随意定义的,需要遵循如下所示的规则:
变量名中可以包含英文字母a-z, A-Z、数字0-9和下划线_;
变量名只能以英文字母a-z, A-Z或下划线_开头,不能以数字开头;
变量名中不允许使用空格;
变量名不能是任何 C# 中的保留字或关键字,例如 char、float 等。
初始化变量
C# 中变量可以通过等号后跟一个常量表达式的形式进行初始化(赋值),语法格式如下:
variable_name = value;
也可以在变量声明时直接进行初始化,只需要在声明变量后使用等号后跟一个常量表达式即可,语法格式如下:
data_type variable_name = value;
下面通过一些简单的示例来演示一下变量的初始化:
int a, b, c; a = 1; b = 2; c = 3; char d = ''; float e = 3.14, f = 1.23;
注意:正确初始化变量是一种良好的编程习惯,否则程序运行时可能会产生意外的结果。
【示例】下面通过一个完整的示例来演示一下各种类型变量的声明和初始化:
using System; namespace c.biancheng.net{ class Program { static void Main(string[] args) { short a; int b ; double c; /* 初始化变量 */ a = 10; b = 20; c = a + b; Console.WriteLine("a = {0}, b = {1}, c = {2}", a, b, c); Console.ReadLine(); } } }
编译并执行上述代码,运行结果如下:
a = 10, b = 20, c = 30
接受用户输入的值
上面的示例代码中我们使用到了一个名为 ReadLine() 的函数,它是由 System 命名空间中的 Console 类提供的,使用 ReadLine() 函数可以接受来自用户输入的内容并将其存储到变量中。
示例代码如下:
using System; namespace c.biancheng.net{ class Program { static void Main(string[] args) { int a, b; Console.WriteLine("请输入第一个数字:"); a = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("请输入第二个数字:"); b = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("{0}+{1}={2}", a, b, a+b); } } }
因为使用 Console.ReadLine() 接收的数据是字符串格式的,所以示例中我们需要使用 Convert.ToInt32() 函数来将用户输入的数据转换为 int 类型。
C# 中的 Lvalues 和 Rvalues 表达式
C# 中有两种表达式,分别是 Lvalues 表达式和 Rvalues 表达式。Lvalues 和 Rvalues 一般是使用等号=进行分隔的,等号左边的叫 Lvalues, 等号右边的叫 Rvalues。
Lvalues:又称左值,左值表达式可以出现在赋值语句的左边或右边;
Rvalues:又称右值,右值表达式只可以出现在赋值语句的右边。
变量名是 Lvalues 的,所以可以出现在赋值语句的左边,而数值是 Rvalues 的,因此不能被赋值,不能出现在赋值语句的左边。下面就是一条有效的语句:
int age = 27;
而下面这条语句则是无效的,会导致编译错误:
123 = 321;
C#数据类型转换
数据类型转换就是将一种类型的数据转换为另一种类型,在 C# 中有两种形式的类型转换方式,分别是隐式类型转换和显示类型转换,下面就来详细介绍一下。
隐式类型转换
隐式类型转换是由 C# 以类型安全的方式执行的,转换的过程中不会导致数据丢失,例如从较小的整数类型(例如 int)转换到较大的整数类型(例如 long),从派生类转换为基类。
隐式转换不需要我们编写额外的代码,下例中演示了如何使用隐式类型转换的方式将 int 类型的数据转换成 double 类型:
int a = 10; double b = a;
提示:一种数据类型(类型 A),只要其取值范围完全包含在另一种数据类型(类型 B)的取值范围内,那么类型 A 就可以隐式转换为类型 B。基于这一特性,C# 的隐式类型转换不会导致数据丢失。
显式类型转换
显式类型转换也叫强制类型转换,这种转换需要使用(type)value的形式或者预定义函数显式的完成,显式转换需要用户明确的指定要转换的类型,而且在转换的过程中可能会造成数据丢失,例如将 double 类型转换为 int 类型。
下面通过一个示例来演示一下显式类型转换:
using System; namespace c.biancheng.net{ class ExplicitConversion { static void Main(string[] args) { double d = 5673.74; int i; // 将 double 类型转换为 int i = (int)d; Console.WriteLine("转换前{0},转换后{1}", d, i); Console.ReadKey(); } } }
编译并执行上述代码,运行结果如下:
转换前5673.74,转换后5673
C# 中还提供了一系列内置的类型转换方法,如下表所示:
【示例】使用上面提供的方法,将各种类型的数据转换为字符串类型:
using System; namespace c.biancheng.net{ class StringConversion { static void Main(string[] args) { int i = 75; float f = 53.005; double d = 2345.7652; bool b = true; Console.WriteLine(i.ToString()); Console.WriteLine(f.ToString()); Console.WriteLine(d.ToString()); Console.WriteLine(b.ToString()); Console.ReadKey(); } } }
编译并执行上述代码,运行结果如下:
75
53.005
2345.7652 True
C#运算符
运算符其实就是一个符号,用来告诉编译器执行特定的数学或逻辑运算。C# 中内置了丰富的运算符,大致可以分为如下几类:
- 算术运算符;
- 关系运算符;
- 逻辑运算符;
- 位运算符;
- 赋值运算符;
- 其它运算符。
下面就来分别介绍一下这些运算符。
算术运算符
算术运算符即完成特定算术运算的符号,C# 中支持的算术运算符如下表所示:(假设变量 A = 10,变量 B = 20)
这里要重点说一下自增运算符和自减运算符,它们既可以放在变量的前面使用也可以放在变量的后面使用。在变量的前面时表示先进行自增或自减运算,然后再将值赋值给变量;在变量的后面时则正好相反,先将值赋给变量,然后再进行自增或自减运算。
下面通过示例来演示一下 C# 中算术运算符的应用:
using System; namespace c.biancheng.net { class Demo { static void Main(string[] args) { int a = 10; int b = 20; Console.WriteLine("a + b = {0}", a + b); Console.WriteLine("a - b = {0}", a - b); Console.WriteLine("a * b = {0}", a * b); Console.WriteLine("a / b = {0}", a / b); Console.WriteLine("a % b = {0}", a % b); Console.WriteLine("++a 的值是 {0}", ++a); a = 10; // 重新给变量 a 赋值 Console.WriteLine("a-- 的值是 {0}", a--); Console.WriteLine("a 的值是 {0}", a); Console.ReadLine(); } } }
运行结果如下:
a + b = 30
a - b = -10
a * b = 200
a / b = 0
a % b = 10
++a 的值是 11
a-- 的值是 10
a 的值是 9
关系运算符
关系运算符用来比较运算符左右两边的操作数,下表列举了 C# 中支持的所有关系运算符:(假设变量 A = 10,变量 B = 20)
逻辑运算符
下表列举了 C# 中支持的逻辑运算符:(假设变量 A 的布尔值是 true,变量 B 的布尔值是 false)
下面通过示例来演示一下 C# 中逻辑运算符的使用:
using System; namespace c.biancheng.net { class Demo { static void Main(string[] args) { bool a = true; bool b = false; if (a && b){ Console.WriteLine("(a && b) 条件为真"); }else{ Console.WriteLine("(a && b) 条件为假"); } if (a || b){ Console.WriteLine("(a || b) 条件为真"); }else{ Console.WriteLine("(a || b) 条件为假"); } if (!(a && b)){ Console.WriteLine("!(a && b) 条件为真"); }else{ Console.WriteLine("!(a && b) 条件为假"); } Console.ReadLine(); } } }
运行结果如下:
(a && b) 条件为假
(a || b) 条件为真
!(a && b) 条件为真
位运算符
位运算符用来对二进制位进行操作,&、| 和 ^ 的真值表如下:
假设 A = 60,B = 13,它们的二进制格式和位运算结果如下:
A = 0011 1100
B = 0000 1101
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011
示例代码如下所示:
using System; namespace c.biancheng.net { class Demo { static void Main(string[] args) { int a = 60; /* 60 = 0011 1100 */ int b = 13; /* 13 = 0000 1101 */ int c = 0; c = a & b; /* 12 = 0000 1100 */ Console.WriteLine("a & b 的值是 {0}", c ); c = a | b; /* 61 = 0011 1101 */ Console.WriteLine("a | b 的值是 {0}", c); c = a ^ b; /* 49 = 0011 0001 */ Console.WriteLine("a ^ b 的值是 {0}", c); c = ~a; /*-61 = 1100 0011 */ Console.WriteLine("~a 的值是 {0}", c); c = a << 2; /* 240 = 1111 0000 */ Console.WriteLine("a << 2 的值是 {0}", c); c = a >> 2; /* 15 = 0000 1111 */ Console.WriteLine("a >> 2 的值是 {0}", c); Console.ReadLine(); } } }
运行结果如下:
a & b 的值是 12
a | b 的值是 61
a ^ b 的值是 49
~a 的值是 -61
a << 2 的值是 240
a >> 2 的值是 15
其他运算符
除了上面介绍的运算符之外,C# 中还支持一些其他的重要运算符,如下表所示:
下面通过示例来演示一下上述这些运算符的使用:
using System; namespace c.biancheng.net { class Demo { static void Main(string[] args){ /* sizeof 运算符的实例 */ Console.WriteLine("int 的大小是 {0}", sizeof(int)); Console.WriteLine("short 的大小是 {0}", sizeof(short)); Console.WriteLine("double 的大小是 {0}", sizeof(double)); /* 三元运算符的实例 */ int a, b; a = 11; b = (a == 1) ? 20 : 30; Console.WriteLine("b 的值是 {0}", b); b = (a == 11) ? 20 : 30; Console.WriteLine("b 的值是 {0}", b); Console.ReadLine(); } } }
运行结果如下:
int 的大小是 4
short 的大小是 2
double 的大小是 8
b 的值是 30
b 的值是 20