您的位置:首页 > 职场人生

黑马程序员————————C#基础知识(三)

2013-10-03 12:59 561 查看
 ----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流!
---------------------- 
l      转义符
l      算术运算符与类型转换
l      复合函数
l      异常捕获和自加自减
l      复合运算符
l      关系运算符
l      逻辑运算符
l      条件运算符及其短路
l      各种运算符优先级比较
1.转义符
 1)        
      C#中,用“\”加一个字符组成转义字符,一般用来输出特殊符号,比如说想要在Console.WriteLine(“在这里输入内容”); 中加入双引号,因为函数中已经包含双引号,如果直接输入则会造成错误,这时需要用“\”加引号进行转义。例如:
 Console.WriteLine("在这里输入\"内容");    输出语句中有一个引号
 Console.WriteLine("在这里输入\"\"内容");   输出语句中有两个引号
\加\可输出\
\加”可输出”
\加汉字,+,%等都不能组成转义字符,因为它们可以直接输出,  因此,\加字符组成的转义字符一般用来输入不能直接输入的特殊字符如
\,”,换行,退格。
\加字母组成有特殊意义的转义字符,如下:
\n        (换行符)
\b        (退格符)
\r          (回车符)  跳转到本行开始位置
例如:Console.WriteLine("1234\r5");   输出5234 ,回车后的内容5跳转本行开始,覆盖了1   
\t    tab键(制表符)由多个空格组成,具有行与行对齐功能
如下:
  Console.WriteLine("1\t2\t3\t4\t");
 Console.WriteLine("123\t34561\t14567\t123456\t");
输出后,两行输入内容中的数字将会对齐,


2)如果在输出语句之前加上符号@,则输出语句中的\可被直接输出,不会用作组建转义字符,一般常用于输出语句为路径时,比如:
Console.WriteLine(@"C:\Users\lenovo\Desktop\html\net");
注意@符号需要加到格式要求的双引号之前
另:输入语句之前加上@,则输入语句可以换行而不会产生编译错误;输入语句中输入双引号,编译输出后会变成单引号。
Console.WriteLine(@"1234""45565");    


        
所以需要用两个双引号来输出一个双引号。
 Console.WriteLine(@"看  ""我"" 的反应"); 


2.算术运算符与数据类型转换(自转和强转)
+  -  * 
/   %(取模、取余数)
它们都是二元运算符,运算过程中,优先级与数学上优先级相同,都是先乘除后加减,有括号先算括号里,相同级别的从左至右算。但不同于数学运算中的是,小括号可以无限制添加,但一定要成对儿出现。
如((a+b)+(2+2))*c
要求参与运算的操作数类型必须相同,并且经过运算后的结果也与运算数类型相同。参与运算(算术运算和赋值运算)的操作数和结果类型必须一致。当不一致时,满足下列条件,系统自动完成类型转换。(数据类型必须兼容,必须一边的数据范围大,一边的数据范围小,并且把小的转向大的,不丢失精度,只有不丢失精度的同类数据类型的变量,系统才会发生隐式转换)
 两种类型兼容
int与double兼容
目标类型大于源类型
double>int
对于表达式
       如果一个操作数为double类型,则整个表达式可提升为double类型。
           int
a = 10, b = 3;
           double c = a / b;
           Console.WriteLine(c);       输出结果c=3  
           int
a = 10, b = 3;
           double c =1.0* a / b;
           Console.WriteLine(c);       输出结果c=3.33333333333333
           double a = 10, b = 3;
           double c =1.0* a / b;
           Console.WriteLine(c);       输出结果c=3.3333333333333
如上:在第一个运算函数中发生了隐式类型转换,因为发生运算的a,b两个变量都是int型,所以运算结果也是int型,而int又被double兼容,因而默认程序无错误编译输出产生结果,忽略小数。
强制类型转换:要求数据类型一定要兼容(强制转换,不进行四舍五入)
语法:(数据类型)待转换的值
如:   int
x = (int)3.14;
           Console.WriteLine(x);
 虽然此时变量的值为double类型,但是加入(int)强制转换,输出结果为3.即便丢失了0.14的精度,编译也未发生错误。
强制转换要求待转换值的类型与目标类型都是数值类型,也就是说,只是数值类型变量之间的转换。
3. 函数Convert.ToInt32和复合函数
              Console.WriteLine("请输入您的年龄。");
           string s =Console.ReadLine();
           int age =Convert.ToInt32(s);
           Console.WriteLine("您的年龄是{0}",age);
           int year = 2013 - age;
           Console.WriteLine("您是{0}出生的",year);
函数Convert.ToInt32();可将string类型的数字转换为有效(可参与算术运算)的int类数字,但是如果用户键入非数字以及超过int32位范围的数字,则会出现错误,所以要求在之后编写其他代码来要求规范用户输入,目前只能用try和catch报错。
可以将两个函数连接在一起组成:如下,多个函数组成需求变量,只要编译无错误,保证函数可被相应的数据类型声明,即可编译运行。
           Console.WriteLine("请输入您的年龄!");
           int year=2013-Convert.ToInt32(Console.ReadLine());
           Console.WriteLine("您是{0}年出生的",
year);
           Console.ReadKey();
其他的与此类似的函数还有Convert.ToSByte(); Convert.ToInt64(); 等等;
String  x =Convert.ToString();
所有类型都可以通过该函数转换成string类型
4.C#中用来捕获异常的函数:
          try          
             {
               在这里输入有可能出错的代码
           }
           catch
           {
               如果try中的程序运行出错,程序会自动跳转到这里执行catch中的程序          
           }
一般情况下,在catch中写入报错后的处理方法。如果try中的程序没有出错,则不会执行catch中的代码,而一旦try中的程序出错,程序会立刻执行catch中的代码,而try未执行的代码将跳过作废不再执行。
5.小程序,将秒数转换成具体的天数小时数分钟数
//秒数转换成天数和小时分钟
      Console.WriteLine("请输入你要转换的秒数:");
      int
seconds =Convert.ToInt32(Console.ReadLine());             //暂不考虑无效转换
      int days = seconds / (3600 * 24);
      int mod = seconds % (3600 * 24);   //除以天后剩余的秒数
      int hours = mod / 3600;     
      mod = mod % 3600; //除以天后剩余的秒数再除以小时后剩余的秒数
      int min = mod / 60;
      int second = mod % 60; //除以天,小时,分,后剩余的秒数,前面都涉及到mod的重新赋值法   
      Console.WriteLine("您好,您输入的秒数转换后是{0}天{1}小时{2}分{3}秒",days,hours,min,second);
      Console.ReadKey();
当然,如果真的是这种程序的话,大概需要定义long类型或者double类型变量,毕竟总有很多闲的蛋疼的人输入一长串数字考验程序。
6.变量的自加自减
 ++  自加,分前自加和后自加
 --   自减,分前自减和后自减
 以上两种都是一元运算符,只要一个操作数就可以运算。一元运算符比二元运算符(加减乘除)有优先级。
语句中运算时,前自加/自减取新值参与运算;后自加/自减取原值参与运算;但是自加/自减的变量最后输出的都是新值。例如:
     int
a = 18, b = a++ - 10;
          Console.WriteLine(b);
          Console.ReadKey();
运算后输出的结果为8,而
           int
a = 18, b =++a - 10;
           Console.WriteLine(b);
           Console.ReadKey();
运算后的结果为9;但以上两个语句运算后的变量a的值都为19.
           int
a = 18, b = a--- 10;
           Console.WriteLine(b);
           Console.ReadKey();
运算结果为8;
           int
a = 18, b = --a- 10;
           Console.WriteLine(b);
           Console.ReadKey();
 
运算结果为7;但是以上两个语句运算后的变量a的值都为17.
Q:       int
a = 2;
                    a
= a++;
                    Console.WriteLine(a);
为什么该语句输出后的值依然是2?难道后++的优先级小于赋值?而且程序运算完成后a没有再自加?
虽然                     
int a = 2, b = 3;
                     b = a++;
                     Console.WriteLine("{0}{1}",a,b);
这个时候a自加了,上面却没有,难道上式程序以原值赋值运行后没有再自加吗?
到现在依然认为只是因为优先级的原因,后加加是基元运算符,运算时变量中的数据还未来得及改变,等运算完成后才自加,前加加为一元运算符,先自加改变变量中的值才发生的运算。上面二例中变量改变,自然赋值也就来得及改变,而一例运算之前,并未发生改变。希望以后有机会,能看看它们之间微小的运算速度差异来做出判断。
7.复合运算符/复合赋值符(不是一元运算符,因为一个操作数时无法独立运算)
l       +=      a+=3相当于a自加三,也就是a=a+3;但是=右边没有值的时候就会出错,以下同理。
l       -=     
l       *=                  
l       /=     
l       %=   
之所以要用复合赋值符代替诸如a=a+3这样的表达式是因为程序执行的时候会更快,代码写入也会更简练。
能够改变变量中值的运算符只有自加自减等号以及复合运算符。
8.C#中的关系运算符
>   大于
   <    
小于
== 等于
!=  不等于
>=  大于等于
     <=  小于等于
关系表达式:由关系运算符连接起来的表达式。
 赋值表达式:由赋值运算符(等号和复合赋值符)连接起来的表达式。
运算符两侧的内容经关系表达式运算后形成命题,即判断成立不成立,从而引出bool数据类型。运算符两侧运算数据类型要求一致或者兼容;一般数值类数据类型的变量可以比较大小,非数值类型的变量只能比较等于或者不等。
9.bool类型
 只有两个值:true    false
关系表达式形成的命题成立则为true
不成立则为false
例如:
           int a =
12, b = 19;
           bool isRight = a < b;
           Console.WriteLine(isRight);          
           Console.ReadKey();
输出结果是:true;
 
           int a =
12, b = 19;                 
           bool isRight = a > b;
           Console.WriteLine(isRight);
           Console.ReadKey();
输出结果是:false;
10.逻辑运算符
  &    逻辑与  二元运算符
  ||     逻辑或  二元运算符
  !    逻辑非(取反)  一元运算符
  ^     逻辑异或        二元运算符
1)逻辑与语法:bool
isRight=表达式① &表达式②;
逻辑“与”连接的表达式①和②,要求能够求解成bool类型,一般情况下表达式都是关系表达式。
逻辑“与”运算的结果也是bool类型,运算图解如下:
表达式①的值
表达式②的值
逻辑“与”结果
True
True
True
True
False
False
False
True
False
False
False
False
当两个表达式的值都为true时,经过逻辑“与”运算的变量isRight的值为true.
2)逻辑或语法:bool
isRight=表达式① |表达式②;
逻辑“或”的运算图解如下:
表达式①的值
表达式②的值
逻辑“与”结果
True
True
True
True
False
True
False
True
True
False
False
False
当两个表达式的值都为false是,经过逻辑“或”运算的变量isRight的值为false,其他情况都是true.
3)逻辑非语法: (布尔型表达式)
  如果布尔型表达式为true,则运算后结果为false.
  如果布尔型表达式为false,则运算后结果为false.
4)逻辑异或语法
bool isright=表达式①^表达式②
  当且仅有一个表达式为true时整个语句运算为true,否则运算为false.
       Console.WriteLine(true^true);         //输出false
           Console.WriteLine(true ^false);        //输出true
           Console.WriteLine(false ^true);        //输出true
           Console.WriteLine(false ^false);       //输出false
11.条件运算符及其短路
  &&    条件与    二元运算符
||     条件或     二元运算符
  ?:   条件运算    三元运算符(具体参见循环结构体中三元表达式)
条件运算符同样用于计算可以计算为bool类型结果的表达式,运算图解与对应的逻辑运算符相同。不同的是条件运算符在某些情况下会发生短路而逻辑运算符不会。
   因为条件 && 的判定条件要求两个表达式都为true时才为true,其他都为false,当
&&之前的表达式判定为false时,&&已经直接判断整个连接表达式运算结果为false,此时&&后的表达式将不再运算。
同理,条件||的判定条件要求两个false时才为false,只要有一个true则结果为true,因而当第一个表达式判定值为true时,程序运行到||时将发生短路(终止)。
逻辑或和条件或比较:
           int
a = 5;
           int b = 4;
           if (a++>b| a-->b)
           {
               Console.WriteLine("逻辑与");
               Console.WriteLine(a);
               Console.WriteLine(b);
           }
           a = 5;               //为了比较,特意保留原值
           b = 4;
           if (a++ > b || a-- > b)
           {
               Console.WriteLine("条件与");
               Console.WriteLine(a);
               Console.WriteLine(b);
           }
输出:



可以看出,逻辑或判断出第一个表达式为true后继续判断第二个表达式而条件或并未判断。
逻辑与和条件与比较:
 
           int
a = 5;
           int b = 4;
           if
(a++ < b & a-- < b)
           {
               Console.WriteLine("逻辑与判断为true");
           }
           else
           {
               Console.WriteLine("逻辑与判断为false");
               Console.WriteLine(a);
               Console.WriteLine(b);
           }
           a = 5;
           b = 4;
           if (a++ < b && a-- < b)
           {
               Console.WriteLine("条件与判断为true");
           }
           else
           {
               Console.WriteLine("条件与判断为false");
               Console.WriteLine(a);
               Console.WriteLine(b);
           }
输出:



可以看出,逻辑与判断出第一个表达式为false后继续判断第二个表达式而条件与并未判断。
12.各种运算符的优先级比较(引用自C#语言规范):
类别
表达式
说明
基本
x.m
成员访问
x(...)
方法和委托调用
x[...]
数组和索引器访问
x++
后增量
x--
后减量
new T(...)
对象和委托创建
new T(...){...}
使用初始值设定项创建对象
new {...}
匿名对象初始值设定项
new T[...]
数组创建
typeof(T)
获得T的System.Type对象
checked(x)
在 checked上下文中计算表达式
unchecked(x)
在unchecked上下文中计算表达式
default(T)
获取类型T的默认值
delegate {...}
匿名函数(匿名方法)
一元
+x
恒等
-x
求相反数
!x
逻辑求反
~x
按位求反
++x
前增量
--x
前减量
(T)x
显式将x转换为类型T
乘除
x * y
乘法
x / y
除法
x % y
求余
加减
x + y
加法、字符串串联、委托组合
x – y
减法、委托移除
 
移位
x << y
左移
x >> y
右移
关系和类型检测
x < y
小于
x > y
大于
x <= y
小于或等于
x >= y
大于或等于
x is T
如果x属于T类型,则返回true,否则返回false
x as T
返回转换为类型T的x,如果x不是T则返回null
相等
x == y
等于
x != y
不等于
逻辑AND
x & y
整型按位 AND,布尔逻辑
AND
逻辑XOR
x ^ y
整型按位 XOR,布尔逻辑
XOR
逻辑OR
x | y
整型按位 OR,布尔逻辑
OR
条件AND
x && y
仅当x为true才对y求值
条件OR
x || y
仅当x为false才对
y求值
空合并
X ?? y
如果x为null,则对y求值,否则对x求值
条件
x ? y : z
如果x为true,则对y求值,如果x为false,则对z求值
赋值或匿名函数
x = y
赋值
xop=
y
复合赋值;支持的运算符有:
*=  /=  %=  +=  -=  <<=  >>=  &=  ^=  |=
(T x) => y
匿名函数(lambda表达式)
从上到下,优先级依次降低。
----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流!
----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息