[Day 002 of C#] "What, A, SHAME!!!!!!"
Day 002
part 011 - 030 & 037 & 056.
变量
内存中的每一个数据都对应着一个地址。
因为地址太难记,所以用有意义的变量。
变量用来在计算机内存中存储数据。
声明或定义变量的方式:
在内存中开辟了一块能够存储整数的空间
声明或定义了一个int类型的变量
- 变量类型 变量名;
变量名 = 值;\[eg. \]int number; number = 203;
- 变量类型 变量名 = 值;\[eg. \]
int number = 203;
"="在这里并不表 等于,而是 赋值
表示把"="右边的值赋给左边的变量。
变量 | 变量类型 | 声明方式 |
---|---|---|
整数 | int | int i = 203 |
小数 | double | double d = 2.03 |
字符串 | string | string str = "我爱你" |
字符(只能存储一个字符) | char | char c = '啵' |
金钱(值末必须加"m") | decimal | decimal money = 800m |
string 字符串类型可以声明空,但char 字符类型不可以
string str = "";
细节
红色波浪线: 语法错误
绿色波浪线: 语法没错,但有可能会出现错误,但也不一定会出现错误
变量的声明规则: 应先声明再赋值再使用
变量的命名规则
- 必须以"字母”、"__"、"@" 开头,不要以数字开头
- 后面可以跟任意"字母”、数字、下划线,其他符号不可行
- **变量名不能与c#系统中的关键字重复.
- **在c#中,大小写是敏感的.
- **同一个变量名不允许重复定义(先这么认为,不严谨)
变量的命名规范
-
Camel (骆驼命名规范):
变量名首单词首字母小写,其余每个单词首字母大写
多用于给变量和字段命名\[eg. \]c# string congratulationYouSickSonOfBitchYouWin = "turns out nobody even cares about anything about me because I'm just a pathetic 13-year-old boy who only discharge himself on the Internet and loving someone on the Internet who is not even a homosexual or bisexual because there is nobody cares about him in real life either which is fucked up but still believes that everything will be as the perfect or just nice and cozy as he thought it will be eventually so that he can live a life he dreamed about for a very long time since the very first day that he met with the guy he is now loving with to get happiness and rid of loneliness but also blaming himself all the time even though sometimes it's not even his fault because he knew it from the heart that it will cost losing of friendships or relationships with the gangs he related from the ages and then starts to crying alone, be emotional and tries to have contacts with the one he loves to get some comfort but gets ignored everytime!"
-
Pascal:
每个单词首字母都大写,其余字母小写
多用于给 类 或 方法 命名\[eg. \]
class CongratulationYouSickSonOfBitchYouWin
变量的作用域 (part 037.)
变量的作用域就是你能够使用到这个变量的范围
变量的作用域一般从声明这个变量的两个相对应的大括号内起作用,出了这两个大括号,就不能被访问并使用了。
接受用户的输入
Console.ReadLine();
一般通过string变量来接受并存储用户的输入
string str = Console.ReadLine();
练习
Console.WriteLine("你喜欢吃啥水果捏");
string fruits = Console.ReadLine();
Console.WriteLine("好耶,我也喜欢吃{0}", fruits);
Console.ReadKey();
/* 输出:
你喜欢吃啥水果捏
(用户输入) ㄐㄐ
好耶,我也喜欢吃ㄐㄐ
*/
运算符
"=" 赋值运算符
"=" 在这里并不表 等于,而是 赋值表示把"="右边的值赋给左边的变量。
由"="连接的表达式被称为 赋值表达式
每个表达式都可以求解出一个定值,对于赋值表达式而言,等号左边的值,就是整个赋值表达式的值
一旦给一个变量重新赋值,那么老值就不存在了,取而代之的是新值
"+"
- 相加:两边是数字的时候,"+"作相加
Console.WriteLine( 5 + 5);
Console.ReadKey();
// 输出: 10
- 连接:当"+"两边有一边是字符串时,"+"作连接
Console.WriteLine( 5 + 5);
Console.ReadKey();
// 输出 55
"+" 的练习:
有个叫卡卡西的人在旅店登记的时候前台让他填一张表,这张表的里的内容要存到电脑上,有姓名、年龄、邮箱、家庭住址,工资.之后把这些信息显示出来:
我叫卡卡西,我住在火影村,我今年30了,我的邮箱是kakaxi@qq.com,我的工资2000.
string name = "卡卡西";
string livingIn = "火影村";
int age = 30;
string emailAddress = "kakaxi@qq.com";
decimal paycheck = 800m;
Console.WriteLine("我叫" + name + ",我住在" + livingIn + ",我今年" +age + "岁了,我的邮箱是" + emailAddress + ",我的工资是" + paycheck);
Console.ReadKey();
// 输出: 我叫卡卡西,我住在火影村,我今年30了,我的邮箱是kakaxi@qq.com,我的工资800
算术运算符
算术运算符 | 意义 | 用法 | 结果 |
---|---|---|---|
+ |
相加 | 1 + 1 | 2 |
- |
相减 | 2 - 1 | 1 |
* |
相乘 | 2 * 1 | 2 |
/ |
除以 | 2 / 1 | 2 |
% |
取余 | 10 % 3 | 1 |
++ |
自加一 | i++ / ++i | 203 |
-- |
自减一 | i-- / --i | 201 |
复合赋值运算符 | 意义 |
---|---|
+= |
相加 |
-= |
相减 |
*= |
相乘 |
/= |
除以 |
%= |
取余 |
int i = 202;
i+=1028 //此时i = 1230
/* 上面的代码等同于
i = i + 1028 // i = 202 + 1028 = 1230
*/
运算优先级和普通的四则运算一样
在一个表达式中,若加上的是i++,那么运算时加上的会是i的原值,运算完成之后,i的值才会加一;要是加上的是++i,那么运算时加上的会是(i + 1)后的值
// i++ (后++)
int i = 202;
int result = 10 + i++;
/* 上面这串代码等同于:
int result = 10 + i; //此时i = 202, result = 10 +202 = 212
i++;//这时i = 203
*/
Console.WriteLine(i);
Console.WriteLine(result);
Console.ReadKey();
/* 输出:
203
212
*/
// ++i (前++)
int i = 202;
int result = 10 + ++i;
/* 上面这串代码等同于:
i++; //这时i = 203
int result = 10 + i; //result = 10 + 203 = 213
*/
Console.WriteLine(i);
Console.WriteLine(result);
Console.ReadKey();
/* 输出:
203
213
*/
前--、后--同理。
int a = 5;
int b = a++ + ++a * 2 + --a + a++;
/* b = 5 + 7 * 2 + 6 + 6 = 31
上面这串代码等同于:
int b = a; //此时a = 5, b = 5
a++; // 此时a = a + 1 = 5 + 1 = 6
a++; // 此时a = a + 1 = 6 + 1 = 7
int b = b + a * 2; //b = 5 + 7 * 2 = 5 + 14 = 19
a--; //此时a = a - 1 = 7 - 1 = 6
int b = b + a; //b= 19 + 6 = 25
int b = b + a; //b = 25 + 6 = 31
a++; // 此时a = a + 1 = 6 + 1 = 7
*/
Console.WriteLine(a);
Console.WriteLine(b);
Console.ReadKey();
/* 输出:
7
31
*/
- 一元运算符:
对于像++、--这样,只需要一个操作数即刻完成的,我们称之为一元运算符 - 二元运算符:
即+ - * / % 这类的运算符,需要两个或以上操作数才能完成运算,我们称之为二元运算符
因此,由上可知: 一元运算符的优先级要高于二元运算符
*即,如果在一表达式中,既有一元运算符,又有二元运算符,会首先计算一元运算符
练习:
计算半径为5的圆的面积和周长并打印出来.(pi为3.14)
面积:pi*r*r;Perimeter(周长)
int r = 5;
double pi = 3.14;
double s = pi * r * r;
double c = 2 * pi * r;
Console.WriteLine("圆面积为{0}, 周长为{1}");
Console.ReadKey();
关系运算符
关系运算符 | 意义 |
---|---|
> |
大于 |
< |
小于 |
>= |
大于等于 |
<= |
小于等于 |
== |
等于 |
!= |
不等于 |
is |
是(if i is int ) |
bool 类型 (布尔类型) 在c#中用来描述关系运算符的结果
- bool的值只有2个:
- True (真)
- False (假)
用关系运算符连接的表达式称之为关系表达式,关系表达式的结果是bool 类型
bool a = 1027 > 203;
bool b = 1027 < 203;
Console.WriteLine(a);
Console.WrtieLine(b);
Console.ReadKey();
/* 输出:
True
False
*/
逻辑运算符
逻辑运算符 | 意义 |
---|---|
&& |
逻辑与 |
II |
逻辑或 |
! |
逻辑非 |
逻辑或是"||",两个竖线,但是MARKDOWN表格功能中||会被吃掉,所以用II代替(呜呜呜)
-
由逻辑运算符连接的表达式叫做逻辑表达式
-
逻辑运算符两边放的一般都是关系表达式或者bool类型的值
-
逻辑表达式的结果同样也是bool类型的值
-
&&
: 只有两边的式子都为真时,整体也为真。要是有一个假,整体就是假 -
||
: 只要有其中一个式子为真时,整体就为真。 -
!
: "!"后一般只跟一个表达式。如果一个表达式原本就是真,"!"之后便变成假的了
逻辑运算符 | / | True | False |
---|---|---|---|
&& |
True | True | False |
&& |
False | False | Flase |
II |
True | True | True |
II |
False | True | False |
! |
/ | False | True |
逻辑或是"||",两个竖线,但是MARKDOWN表格功能中||会被吃掉,所以用II代替(呜呜呜)
int drctrB = 1027;
int alicePolice = 203;
bool b = drctrB > alicePolice && alicePolice < drctrB;
Console.WriteLine(b);
Console.ReadKey();
// 输出: True
判断闰年练习:
Console.WriteLine("请输入要判断的年份");
int year = Convert.ToInt32(Console.ReadLine());
//年份能够被400整除;
//年份能够被4整除且不能被100整除;
bool b = (year % 400 == 0) || (year % 4 = 0 && year % 100 !=0);
Console.WriteLine(b);
Console.ReadKey()
/* 输出:
请输入要判断的年份
(用户输入: 2020)
True
请输入要判断的年份
(用户输入: 2022)
False
*/
在上面的代码中,先运算了逻辑与的表达式,再进行逻辑或的判断。
即先判断year % 4 = 0 && year % 100 !=0
再判断了year % 400 == 0
因此,
逻辑与的优先级要高于逻辑或
隐士类型转换 (自动类型转换)
等号两边参与运算的操作数必须一直,若不一致,满足下列2个条件会发生自动类型转换,或称之为隐士类型转换
- 两种类型相互兼容
int和 double兼容(都是数字类型)
- 目标类型大于源类型 (小的转大的)
ouble > int
- 对于表达式:
如果一个操作数为double型,则整个表达式可提升为double型
而最简单的就是将其中一个变量乘以1.0
int n0 = 1027;
int n1 = 203;
double mua = 1027 / 203;
Console.WriteLine(mua);
Console.ReadKey();
// 输出: 5
int n0 = 1027;
int n1 = 203;
double mua = 1027 * 1.0 / 203;
//将一个int类型的变量1027乘以一个double类型的变量1.0,则1027 * 1.0变成了Double类型,所以整个表达式都变成了double类型
Console.WriteLine(mua);
Console.ReadKey();
// 输出: 5.059113300492611 (直接计算器敲得QWQ)
double n0 = 1027;
int n1 = 203;
double mua = 1027 / 203;
// 一个double类型变量乘以一个int类型变量,整个表达式变为double类型
Console.WriteLine(mua);
Console.ReadKey();
// 输出: 5.059113300492611 (直接计算器敲得QWQ)
显示类型转换 (强制类型转换)
- 两种类型相互兼容
- 大的转小的
- 语法: (待转换的类型)要转换的值;
double d = 102.7;
int n = (int)d;
Console.WriteLine(n);
Console.ReadKey();
// 输出: 102
Convert类型转换
- 当两个类型变量不兼容时 (例如string与int/double)
// 将一个string类型的变量转换成double类型的变量
string str = "1027";
double d = Convert.ToDouble(str);
// 声明一个double类型的变量d来接收Convert语句所转换的变量
int i = Convert.ToInt32(str);
// 声明一个int类型的变量i来接收Convert语句所转换的变量
Console.WriteLine(d);
Console.WriteLine(i);
Console.ReadKey();
/* 输出:
1027
1027
*/
使用Convert转换时,
面上一定要过得去。
// 将一个string类型的变量转换成double类型的变量
string str = "1027drctrb";
double d = Convert.ToDouble(str);
// 声明一个double类型的变量d来接收Convert语句所转换的变量
int i = Convert.ToInt32(str);
// 声明一个int类型的变量i来接收Convert语句所转换的变量
Console.WriteLine(d);
Console.WriteLine(i);
Console.ReadKey();
// 输出: 会抛异常
由上可知,Convert语句中,被转化的类型与要需要的类型,变量的内容要能兼容,强扭的瓜不甜。
Parse (part. 056)
这里以int类型为例
-
在使用Convert类型转换时,成功了就成功了,失败了就抛异常。
-
int.Parse和Convert.ToInt32的区别:
-
Convert.ToInt32 内部上就是在调用int.Parse
-
因此,int.Parse的效率更高 (少了调用的那几步,尽管这个效率能够被忽视。因此在类型转换时两者皆可)
-
int.Parse 用法
int n = int.Parse("123");
Console.WriteLine();
Console.ReadKey();
TryParse (part. 056)
这里以int类型为例
- 尝试着将一个字符串转换成int类型,并返回一个bool值(成则True,败则False,并且将需要转换的int类型的变量赋值为0)
- int.Parse和int.TryParse的区别:
- int.Parse在转换出错的时候会抛异常,int.TryParse不会
int n = 123;
int n1 = 1027;
bool b = int.TryParse("203", out n);
bool mua = int.TryParse("QWQ", out n1);
/* 在上面,
"203"和out n
"QWQ"和out n1
都是参数
bool类型的变量是这个方法(TryParse)的 返回值
*/
Console.WriteLine(b);
Console.WriteLine(n);
Console.WriteLine(mua);
Console.WriteLine(n1);
Console.ReadKey();
/* 输出:
True
203
False
0
*/
位数的保留
int n0 = 1027;
int n1 = 203;
double mua = 1027 * 1.0 / 203;
Console.WriteLine(mua);
Console.ReadKey();
// 输出: 5.059113300492611 (直接计算器敲得QWQ)
int n0 = 1027;
int n1 = 203;
double mua = 1027 * 1.0 / 203;
Console.WriteLine({0:0.000}, mua); //注意这里!!
Console.ReadKey();
// 输出: 5.059 (直接计算器敲得QWQ)
可以通过占位符来取最终数值的位数
如上述例子里,{0:0.000}中,":"后的 0.000,小数点后的 0 的个数决定了最终取数的小数点位数
方法、函数(Function)的介绍 (part. 056)
TryParse在C#中是一个方法,或称为函数(都是function)
- 作用:
- 函数可以看做“帮你做一件事”的一个超级工具人,
int n = 123;
int n1 = 1027;
bool b = int.TryParse("203", out n);
bool mua = int.TryParse("QWQ", out n1);
在上面,
"203"和out n
"QWQ"和out n1
都是参数
bool类型的变量就是这个函数(TryParse)的 返回值
- 而在函数中,最最重要的就是 参数 和 返回值
- 参数 就是完成这个函数所要提供给这个函数的条件,没有这个条件,函数就摆烂了
- 返回值 就是调用完函数后看到的结果
占位符
先挖坑,再填坑 —— 赵剑宇
string name = "卡卡西";
string livingIn = "火影村";
int age = 30;
string emailAddress = "kakaxi@qq.com";
decimal paycheck = 800m;
Console.WriteLine("我叫{0},我住在{1},我今年{2}了,我的邮箱是{3},我的工资{4}"), name, livingIn, age, emailAddress, paycheck;
Console.ReadKey();
// 输出: 我叫卡卡西,我住在火影村,我今年30了,我的邮箱是kakaxi@qq.com,我的工资2000.
挖多少填多少。多填没效果,少填抛异常[1]
怎么挖,就怎么填
string name = "卡卡西";
string livingIn = "火影村";
int age = 30;
string emailAddress = "kakaxi@qq.com";
decimal paycheck = 800m;
Console.WriteLine("我叫{2},我住在{0},我今年{3}了,我的邮箱是{1},我的工资{4}"), name, livingIn, age, emailAddress, paycheck;
Console.ReadKey();
// 输出: 我叫30,我住在卡卡西,我今年kakaxi@qq.com了,我的邮箱是火影村,我的工资800.
交换变量
- 通过声明第三方变量来进行交换
可以想像成要使一个杯子中装有的可口可乐倒进一个原装有雪碧的杯子,并将另一个杯子中的雪碧倒进原来装有可口可乐的杯子,这时就需要第三个空空的杯子来进行转换。
int n1 = 203; //声明一个变量n1并赋值其为203
int n0 = 1027; //声明一个变量n0并赋值其为1027
int temp; //声明一个变量temp
temp = n0; //将n0的值赋给temp,此时temp = 1027
n0 = n1; //将n1的值赋给n0,此时n0 = 203 (n的交换完成)
n1 = temp; //将temp的值赋给n1,此时n1 = 1027
Console.WriteLine("n0的值现在为:{0},n1的值现在为:{1}", n0, n1);
Console.ReadKey();
// 输出: n0的值现在为: 203,n1的值现在为:1027
- 不通过声明第三方变量来进行交换
int a0 = 1027; //声明一个变量a0并赋值其为1027
int a1 = 203; //声明一个变量a1并赋值其为203
a0 = a0 - a1; //将a0赋值为(a0 - a1),此时a0 = 1027-203 = 824
a1 = a0 + a1; //将a1赋值为(a0 + a1),此时a1 = 824+203 = 1027
a0 = a1 - a0; //将a0赋值为(a1 - a0),此时a0 = 1027-824 = 203
Console.WriteLine("a0的值现在为:{0},a1的值现在为{1}", a0, a1);
Console.ReadKey();
// 输出: a0的值现在为:203,a1的值现在为:1027
转义符
- 转义符指的就是一个
\
加上一个特殊的字符,组成了一个具有特殊意义的字符
转义符 | 作用 |
---|---|
\n |
将一段字符串在指定位置进行换行 |
\b |
类似于Backscape,但放在字符串两端无效 |
\" |
输出一个英文的双引号 |
\t |
类似于文档编辑中tab键的作用 |
\r\n |
在Windows系统中实现\n 的作用 |
\\ |
表示一个\ |
\n
只能在控制台应用程序或者Winform中使用,Windows不行,要使用\r\n
Console.WriteLine("你爱我\n我爱你");
Console.ReadKey();
/* 输出:
你爱我
我爱你*/
"@"
- 放在一堆转义符的最前面,或者是一个字符串前引号的前面,用来取消@后面的转义符的作用
string uwu = @"G:\Movies\Friends\Friends.S10.1080p.BluRay.x265-RARBG"
// 输出: G:\Movies\Friends\Friends.S10.1080p.BluRay.x265-RARBG
- 将字符串按照编辑的原格式输出
Console.WriteLine(@"你爱我
我爱你");
Console.ReadKey();
/* 输出:
你爱我
我爱你*/
Console.WriteLine(@"你爱我
我爱你");
Console.ReadKey();
/* 输出:
你爱我
我爱你*/
sentences.
NMMDW,本来写的差不多了的,然后一脚碰到桌子,碰到电源线,然后全部笔记全是null... (我原先真的有勤劳保存!!) 所以这次记得不怎么详细,原本记得很详细的!(真的!!)
:3
异常: 语法没错,程序运行时由于某些问题,使程序无法正常运行。 ↩︎