11.运算符
-
赋值符号
“
=
”将右侧的值赋给左侧 -
算术运算符
+ - * / %
加减乘除取余
-
算数运算符的优先级
先算乘除取余,再算加减,有括号先括号
-
算术运算符的复合运算符
+= -= *= /=
用于自己参加运算 -
算数运算符的自增减
a++
先用再加
++a
先加再用 -
字符串拼接
1.使用加号 “
+
” 进行字符串拼接2.使用加号 “
+=
” 进行字符串拼接//字符串后面的都变成字符,加括号可以先运算 str1 = 1+2+3+4 //输出10 str2 = ""+1+2+3+4 //输出1234 str3 = 1+2+""+3+4 //输出334 str4 = (1+2)+""+(3+4) //输出37
3.使用
string.Format("待拼接的内容",内容1,内容2,```)
,想要拼接的内容用占位符替代,数字:0~n 依次往后string str = string.Format("我是{0},我今年{1}岁","大学生",12) //输出 我是大学生,我今年12岁
4.控制台打印(和string.Format类似)
console.WriteLine("我是{0},我今年{1}岁","大学生",12) //输出 我是大学生,我今年12岁 console.Write("我是{0},我今年{1}岁","大学生",12) //输出 我是大学生,我今年12岁
-
条件运算符
> < = >= <= != ==
不同数值类型之间可以随意进行比较,特殊类型char string bool只能同类型进行==和!=比较
(在隐式转换中char(ASCII)可以和数值进行比较,还可以和其他char进行><比较)
-
逻辑运算符
&&
逻辑与||
逻辑或!
逻辑非逻辑非优先级>逻辑与优先级>逻辑或优先级
逻辑运算符优先级<算术运算符优先级
逻辑运算符短路规则 在||和&&中,若已经满足了左边的内容将不再执行右边的内容
-
位运算符
主要是用数值类型进行计算,先将数值转换为2进制,在进行位运算1.位与& 同1为1
int a = 1; //001 int b = 5; //101 int c = a & b ; //001
多个数值进行计算时,从左到右,依次计算
2.位或| 有1为1
3.异或^ 相同为0不同为1
4.取反~ 0变1 1变0
5.左移 左移几位右侧加几个零
6.右移 右移几位右侧去掉几个数
-
三目运算符
空位1?空位2:空位3bool类型?bool为真时返回内容:bool为假时返回内容
12.条件分支语句
让顺序执行的代码产生逻辑分支
-
if
if("条件"){} if("条件"){}else{} if("条件"){}else if{"条件"}else ```
-
switch
switch() { case 常量: { 代码; break; } case 常量: { 代码; break; } default://如果上方case条件都不满足,就会执行default中的代码。 { 代码; break; } }
13.循环语句
-
while循环
while(condition) { statement(s); }
在这里,statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块。condition 可以是任意的表达式,当为任意非零值时都为真。当条件为真时执行循环。只要给定的条件为真,C# 中的 while 循环语句会重复执行一个目标语句。
-
do while循环
do { statement(s); }while( condition );
-
不像 for 和 while 循环,它们是在循环头部测试循环条件。do…while 循环是在循环的尾部检查它的条件。
-
do…while 循环与 while 循环类似,但是 do…while 循环会确保至少执行一次循环。
-
-
for循环
for ( init; condition; increment ) { statement(s); }
-
init 会首先被执行,且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也可以不在这里写任何语句,只要有一个分号出现即可。
-
接下来,会判断 condition。如果为真,则执行循环主体。如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。
-
在执行完 for 循环主体后,控制流会跳回上面的 increment 语句。该语句允许您更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。
-
条件再次被判断。如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。在条件变为假时,for 循环终止。
-
-
foreach循环
foreach (var item in collection) { statement(s); }
collection 是要遍历的集合,item 是当前遍历到的元素。
以下实例有三个部分:
- 通过 foreach 循环输出整型数组中的元素。
- 通过 for 循环输出整型数组中的元素。
- foreach 循环设置数组元素的计算器。
- foreach 循环可以用来遍历集合类型,例如数组、列表、字典等
14.控制台相关方法
-
Clear:清空屏幕上输出的全部内容
Console.WriteLine("下面会进行清空"); //1、清空上方全部内容 Console.Clear(); Console.WriteLine("上面进行了清空");
-
SetWindowSize:设置窗口的大小
-
SetBufferSize:设置缓冲区的大小
注意:
控制台大小分为窗口大小和缓冲区大小 1、先设置窗口的大小,再设置缓冲区的大小
2、窗口的大小和缓冲区的大小不能大于控制台的最大尺寸
3、缓冲区的大小不能小于窗口的大小//窗口大小(程序运行后能看到的控制面板的大小) Console.SetWindowSize(100, 50);//(x,y) //设置缓冲区的大小(缓冲区大小等于窗口大小加上滚动条后面的大小) Console.SetBufferSize(200, 100);//(x,y)
-
SetCursorPosition:设置光标的位置
注意:
- 控制台左上角是坐标的原点(0,0),右侧是x轴的正方向,下侧是y轴的正方向;是一个平面二位坐标系。
- 注意:边界问题(最好不要设置负数)、横纵距离单位不同1y=2x。
//设置光标位置为x=10,y=5; Console.SetCursorPosition(10, 5); Console.WriteLine("设置光标的位置在(10,5)");
-
ForegroundColor:设置前景色
-
BackgroundColor:设置背景色
注意:
设置前景色:从设置之后开始,改变输出内容的颜色;
设置背景色:改变背景颜色,这里需要重点注意的是,只是进行简单的设置不会改变全部的背景色,需要使用一次Clear方法。(个人认为原因是:上面已经输出的内容调用了系统默认的背景色(黑色),只有在重新设置的背景色之后输出的内容才会改变背景的颜色;所以在没有内容输出的空白部分在设置背景色之前就已经调用了系统的默认黑色进行了空白输出,就会显示黑色。(设置背景色:只是设置输出内容的背景色,空白也是输出内容))
Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("上面将前景色设置为红色"); //设置背景色 Console.BackgroundColor = ConsoleColor.Yellow; //Clear:将上面的内容清空后,背景色才能铺展开 Console.Clear(); Console.WriteLine("重置背景色需要将上面的内容Clear一次,才能把整个背景色改变");
-
CursorVisible:设置光标的显隐
//5、光标的显隐 Console.CursorVisible = false; Console.WriteLine("将光标进行了隐藏");
当为false时,就会隐藏光标;为true时就会显示光标跳动。
-
Environment.Exit(0):关闭当前进程,关闭窗口
//6、关闭控制台 Environment.Exit(0);//参数为零,代表该进程完成
参数为0(这里我不知道参数能不能为1),代表该进程全部执行完毕,会关闭当前窗口(在调试模式下不会关闭,发行版可以关闭)。
15.随机数
namespace System
{
public class Random
{
public Random();
public Random(int Seed);<br>
public virtual int Next();
public virtual int Next(int minValue, int maxValue);
public virtual int Next(int maxValue);
public virtual void NextBytes(byte[] buffer);
public virtual double NextDouble();
protected virtual double Sample();
}
}
-
Random();
这是无参构造方法,比如在程序中这样写:
Random a = new Random();
得到的a就是一个随机数生成器,它可以用来生成随机数。
-
int Next();
这个方法返回值为int类型,调用它就能得到一个随机数,反复调用就能反复得到随机数。
示例:
static void Main(string[] args) { Random a = new Random(); for (int i = 0; i < 10; i++) { Console.WriteLine(a.Next()); } Console.ReadKey(); }
这样就可以获得10个随机数
注意:虽然看上去Next方法返回值是int类型,但实际上它只返回非负整数,而且不包括int类型能表示的最大的那个整数(2^31 - 1)
-
int Next(int minValue, int maxValue);
这个方法能指定随机数的生成范围,左闭右开区间,即生成的数能包含minValue,不包含maxValue。可以包含负数。但是maxValue的值不能大于minValue的值,否则运行时会抛出异常。
-
int Next(int maxValue);
这个方法指定随机数的最大值(不包含maxValue),并且它也只能生成非负整数,与Next(0, maxValue)是一个道理,如果传入的maxValue为负数,那么运行时抛出异常,如果maxValue的值为0或1,那么生成的随机数只能是0。
-
double NextDouble();
这个方法能返回一个大于或等于 0.0 且小于 1.0 的随机浮点数。
-
void NextBytes(byte[] buffer);
这个方法传入指定长度的byte类型的数组,用byte类型的随机数填充数组,如:
static void Main(string[] args) { Random a = new Random(); byte[] b = new byte[10]; a.NextBytes(b); foreach(byte i in b) { Console.WriteLine(i); } Console.ReadKey(); }
-
double Sample();
这个方法比较特殊,从声明可以看出来,其他的方法权限都是public,这个方法是protected。从方法的描述上能看到,这个方法返回的也是大于或等于 0.0 且小于 1.0 的随机浮点数,它与NextDouble看上去似乎只是权限不一样,看了下面这段代码就知道了:
namespace sdq { class MyRandom : Random { protected override double Sample() { return 0.125; } } class Program { static void Main(string[] args) { MyRandom a = new MyRandom(); for (int i = 0; i < 10; i++) { Console.WriteLine(a.NextDouble()); } Console.ReadKey(); } } }
代码分析:
首先定义了一个类MyRandom,继承至Random,由于Random中的Sample()是虚方法,因此可以在派生类中将Sample()重写,我在这里是将它固定返回0.125。在Main方法中构造了a这个对象,并且调用了a.NextDouble()去生成10个随机数,运行结果如下:
从结果可以看出来,Random的Sample方法可以改变NextDouble()方法的行为,如果用户想自定义获取随机数的方法,则可以通过重写Sample来实现。
-
Random(int Seed);
最后再说一下这个带参构造函数,它用来在构造对象时指定随机数生成器的种子,而不带参的构造函数则是以时间作为种子。至于种子是个什么东西,我也不知道,通过下面这个例子也许能说明:
using System; using System.Threading; namespace test { class Program { static void Main(string[] args) { Random a = new Random(123); Thread.Sleep(1000); Random b = new Random(123); for (int i = 0; i < 10; i++) { Console.WriteLine("{0}\t{1}", a.Next(), b.Next()); } Console.ReadKey(); } } }
运行结果如下:
可见a对象和b对象是使用相同的种子123构造出来的,之后它们每次生成的随机数的值都是一样的。而如果使用默认的构造方法(以时间为种子)则不会有这种情况。
注:之所以调用Thread.Sleep(1000);是为了错开两次构造随机数对象的时间,如果不这么做的话,使用默认构造方法,连续两次调用Random()得到的结果仍然可能会一样,因为两次调用Random()时的时间是一样的。
我还没有去研究过windows系统时间的最小单位,按一般经验判断可能是us,想想1us内调用两次构造方法时间是够够的吧。
学习过程中参考了以下内容,诚挚感谢知识的分享者!