[关闭]
@callofduty890 2022-11-29T06:14:55.000000Z 字数 9806 阅读 214

二、运算符与表达式

未分类


C#运算符是术语或符号,用于在表达式中对一个或多个操作数进行计算并返回结果,接受一个操作数的运算符被称之为一元运算符,如果改变运算符(+-/*)可以称之为二元运算符,如果出现条件运算符?,这是C#当中唯一的三元运算符。

当表达式包含多个运算符时,运算符的优先级控制着各运算符的运算顺序。例如:x+y*z乘法的优先高于加号的运算符。

算术运算符

C#中以优先级为顺序的算术运算符等级如下(假设表中的num为整型变量,取值为8)

运算符 含义 说明 优先级 实例 结果
++ 自增 操作数增加1 1 ++num 9
-- 自减 操作数减少1 1 --num 7
* 乘法 两个操作数的积 2 num*3 24
/ 除法 第二个操作数除第一个操作数 2 10.0/8 1.25
% 模数 第二个操作符除以第一个操作数后的余数 2 10%num 2
+ 加法 两个操作数相加 3 num+1 9
- 减法 两个操作数相减 3 num-1 7

注意事项:

(1)算术运算符两边的操作数应该都是数值型,若是字符型,则自动转换成字符对应的ASCII码再进行运算

例如:

  1. char a = 'A';//转换成ASCII编码值
  2. int b = 10 + a;
  3. Console.WriteLine(b);

计算结果值:75

什么是ASCII码?

ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是一套基于拉丁字母的字符编码,共收录了 128 个字符,用一个字节就可以存储,它等同于国际标准 ISO/IEC 646。

ASCII 编码于 1967 年第一次发布,最后一次更新是在 1986 年,迄今为止共收录了 128 个字符,包含了基本的拉丁字母(英文字母)、阿拉伯数字(也就是 1234567890)、标点符号(,.!等)、特殊符号(@#$%^&等)以及一些具有控制功能的字符(往往不会显示出来)。

alt ASCII编码

Char数据类型与int数据类型的互转

  1. //int->char
  2. char a = (char)97;
  3. Console.WriteLine(a);
  4. //char->int
  5. int A = 'A';
  6. Console.WriteLine(A);

(2)一元运算符(++)可以出现在操作数之前(++num)也可以出现在之后(num++)

  1. 第一种形式是前缀增量操作。该运算的结果是操作数加1之后的值
  2. 第二种形式是后缀增量操作。该运算的结果是操作数加1之前的值

前:++

  1. int Number = 10;
  2. int result = ++Number;
  3. Console.WriteLine("result:{0} Number:{1}",result,Number);

运行结果:result:11 Number:11

后:++

  1. int Number = 10;
  2. int result = Number++;
  3. Console.WriteLine("result:{0} Number:{1}",result,Number);

运行结果:result:10 Number:11

关系运算符

关系运算符是二元运算符。关系运算符用于将两个操作数的大小进行比较,若关系成立,则比较的结果为True,否则为False。关系运算符的操作数可以是数值类型、字符类型、枚举类型。

关系运算符如下表所示:

(假设表中的value为整型变量,取值为8)

运算符 含义 示例 结果
== 相等 value==8 True
!= 不等于 value != 9 True
> 大于 value>5 True
=
大于或等于 value>=8 True
< 小于 value<8 False
<= 小于或等于 value<=8 True

代码示例:

  1. static void Main(string[] args)
  2. {
  3. int a = 5, b = 6, c = 5;
  4. bool Switch1 = a == b;
  5. Console.WriteLine("a == b\t:{0}", Switch1);
  6. bool Switch2 = b != c;
  7. Console.WriteLine("b != c\t:{0}", Switch2);
  8. bool Switch3 = a>b;
  9. Console.WriteLine("a > b\t:{0}", Switch3);
  10. bool Switch4 = a >= b;
  11. Console.WriteLine("a >= b\t:{0}", Switch4);
  12. bool Switch5 = a < c;
  13. Console.WriteLine("a < b\t:{0}", Switch5);
  14. bool Switch6 = a <= c;
  15. Console.WriteLine("a <= b\t:{0}", Switch6);
  16. }

运行结果:

  1. a == b :False
  2. b != c :True
  3. a > b :False
  4. a >= b :False
  5. a < b :False
  6. a <= b :True

逻辑运算符

用于将操作数进行逻辑运算符,结果为True或False。

特殊点说明:逻辑运算符除逻辑非(!)是一元运算符,其余都是二元运算符

下表按优先级从高到低列表C#当中逻辑运算符

运算符 含义 说明 优先级 实例 结果
! 逻辑非 当操作数为false的时候返回true,当操作数为true返回false 1 !true false
& 逻辑与 两个操作数均为true时,结果才为true否则为false 2 true&false false
^ 逻辑异或 两个操作数不相同,即一个为true一个为false的时候,结果才为true否则为false 3 true^false true
| 逻辑或 两个操作数中有一个为true的时候,结果为true,否则为False 4 true|false true
&& 条件与 两个操作数均为true时,结果才为true。但是仅在必要时才计算第二个操作数 5 false&&true false
|| 条件或 两个操作数中有一个为True,结果即为True,仅在必要的时候才计算第二个操作数 6 false||true true

逻辑表达式-所有结果:

表达式-1 表达式-2 表达式-1 && 表达式-2 表达式-1 || 表达式-2 !表达式-1
False False False False False
True True True True False
True False False True False
False True False True True

逻辑运算符-代码示例:

  1. static void Main(string[] args)
  2. {
  3. bool Switch1=false;
  4. bool Switch2=true;
  5. //逻辑运算符
  6. bool TEST_1 = !Switch1;
  7. Console.WriteLine("!Switch1\t:{0}", TEST_1);
  8. bool TEST_2 = Switch1&Switch2;
  9. Console.WriteLine("Switch1&Switch2\t:{0}", TEST_2);
  10. bool TEST_3 = Switch1^Switch2;
  11. Console.WriteLine("Switch1^Switch2\t:{0}", TEST_3);
  12. bool TEST_4 = Switch1|Switch2;
  13. Console.WriteLine("Switch1|Switch2\t:{0}", TEST_4);
  14. bool TEST_5 = Switch1&&Switch2;
  15. Console.WriteLine("Switch1&&Switch2:{0}", TEST_5);
  16. bool TEST_6 = Switch1 || Switch2;
  17. Console.WriteLine("Switch1||Switch2:{0}", TEST_6);
  18. }

运行结果:

  1. !Switch1 :True
  2. Switch1&Switch2 :False
  3. Switch1^Switch2 :True
  4. Switch1|Switch2 :True
  5. Switch1&&Switch2:False
  6. Switch1||Switch2:True

赋值运算符

赋值运算符(=)将右操作数的值存储在左操作数表示的存储位置,操作数的类型必须相同(或者右边的操作数可以隐式转换为左边的操作数类型)。

1.赋值语句

语句形式如下所示:

  1. 变量名=表达式

其作用是计算右边表达式的值,然后将值赋给左边的变量

  1. bool Switch=true;
  2. double mark=3.14;
  3. string Str="明天会更好";

2.复合赋值语句

复合运算符不仅可以简化程序的代码,使得程序更加精炼,而且可以提高程序的编译效率

复合运算符如表所示:

运算符 含义 举例 等效于
+= 加法赋值 sum+=item sum=sum+item
-= 减法赋值 sum-=item sum=sum-item
*= 乘法赋值 sum*=item sum=sum*item
/= 除法赋值 sum/=item sum=sum/item
%= 取模赋值 sum%=item sum=sum%item

位运算符

位运算符用于按二进制进行逻辑运算,如下表所示

逐位运算:

a b a&b(与) a|b(或) a^b(异或)
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

假设:

  1. A=60,二进制表示:0011 1100
  2. B=13,二进制表示:0000 1101

运算符不同的计算结果:

运算符 描述 实例 二进制-结果 十进制-结果
& 如果同时存在两个操作数,二进制And(与)运算符复制一位到结果当中 A&B 0000 1100 12
| 如果存在于任意操作数数,二进制Or(或)运算符复制一位到结果当中 A|B 0011 1101 61
^ 二进制(异或)运算符复制一位到结果当中 A^B 0011 0001 49
~ 按位取反运算符是一元运算符,具有翻转效果 ~A 1100 0011 -61(补码)
<< 二进制左移运算符,左移动指定数目 A<<2 1111 0000 240
>> 二进制右移运算符,右移动指定数目 A>>2 0000 1111 15

1111 1100

表达式

表达式是可以计算的代码片段,其计算结果一般为单个值。对象以及类型成员。表达式由操作数、运算符和括号按照一定规则组成。表达式通过运算后产生运算结果,运算结果的类型由操作数和运算符共同决定。

例如:表达式a+3由两个操作数和一个运算符组成

表达式的书写规则:

分支结构

分支结构:当你的程序存在两种可能性的时候,那么这种逻辑就是一种分支逻辑‘

流程示意:

语法格式

  1. if(布尔值)
  2. {
  3. //条件成立时进入
  4. }

代码示例:

  1. Console.WriteLine("请输入您购买的号码:");
  2. int Value = Convert.ToInt32(Console.ReadLine());
  3. if (Value==10)
  4. {
  5. Console.WriteLine("恭喜你,中奖了!奖金500万");
  6. }

说明;当条件Value成立的时候也就是value==10即为true这样if语句中的代码才会执行。

分支语句

如果IF里面的条件成立则执行,否则执行else的语句

语法格式

  1. if(条件表达式)
  2. {
  3. 语句-1
  4. }
  5. else
  6. {
  7. 语句-2
  8. }

该语句的作用是当条件表示的值为真的时候,执行if后的语句块-1,否则执行else后的语句

流程示意图
image_1gj109tjv1avj1n751vh11er1jso9.png-18.9kB

代码演示:

  1. Console.WriteLine("请输入考试结果(合格/不合格):");
  2. string result=Console.ReadLine();
  3. if (result == "合格")
  4. {
  5. Console.WriteLine("恭喜考试通过!可以领取毕业证");
  6. }
  7. else
  8. {
  9. Console.WriteLine("尚未通过考试,请积极准备补考");
  10. }
  11. Console.ReadKey();

额外补充一点:IF的缩写

如果IF的花括号里面只有唯一的一句,那么我们可以选择不写花括号。

如下所示

  1. Console.WriteLine("请输入考试结果(合格/不合格):");
  2. if (Console.ReadLine() == "合格")
  3. Console.WriteLine("恭喜考试通过!可以领取毕业证");
  4. else
  5. Console.WriteLine("尚未通过考试,请积极准备补考");
  6. Console.ReadKey();

IF当中也可以嵌套IF语句

  1. Console.WriteLine("请输入考试结果(合格/不合格):");
  2. string result=Console.ReadLine();
  3. if (result == "合格")
  4. {
  5. Console.WriteLine("恭喜考试通过!可以领取毕业证");
  6. Console.Write("请输入考试分数(领取额外奖励):");
  7. int Number=Convert.ToInt32(Console.ReadLine());
  8. if (Number>90)
  9. {
  10. Console.WriteLine("赠送笔记本电脑一台");
  11. }
  12. else
  13. {
  14. Console.WriteLine("赠送笔记本一本");
  15. }
  16. }
  17. else
  18. {
  19. Console.WriteLine("尚未通过考试,请积极准备补考");
  20. }
  21. Console.ReadKey();

选择结构

所谓的选择结构是当你的逻辑存在两个或两个以上的可能性的时候,我们就会选择这种结构

if-else if语句

基本语法定义

  1. if(条件1)
  2. {
  3. 语句-1
  4. }
  5. else if(条件2)
  6. {
  7. 语句-2
  8. }
  9. else if(条件3)
  10. {
  11. 语句-3
  12. }
  13. else
  14. {
  15. 语句-n
  16. }

代码流程图

image_1gj10as0sob78pucrf1guh17j2m.png-27.8kB

以上的条件只要满足一个即可,其他的是不会判断执行的,每一个条件一般是一个区间范围,每一个条件是一个布尔类型的表达式/关系表达式/逻辑表达式

代码示例:

  1. static void Main(string[] args)
  2. {
  3. //请输入您的考试成
  4. Console.WriteLine("请输入您的考试成绩:");
  5. int Mark = Convert.ToInt32(Console.ReadLine());
  6. //判断成绩所在的区间范围
  7. if (Mark >= 90)
  8. {
  9. Console.WriteLine("蒂花之秀");
  10. }
  11. else if (Mark >= 80)
  12. {
  13. Console.WriteLine("造化钟神秀");
  14. }
  15. else if (Mark >= 70)
  16. {
  17. Console.WriteLine("成绩中等,继续努力");
  18. }
  19. else if (Mark >= 60)
  20. {
  21. Console.WriteLine("及格");
  22. }
  23. else
  24. {
  25. Console.WriteLine("不及格,请重修");
  26. }
  27. Console.ReadKey();
  28. }

switch-case语句

这个 一般也是存在两种或两种以上的可能性的时候会考虑,它跟if-else-if的区别是switch-case条件一般是一个具体的值而if-else-if条件一般是一个区间范围。

对于多分支如果使用if-else if结构其实也可以实现,但是语句层次会较多。结构会变得越来越复杂,代码的可读性会变得越来越差,此时可以利用Switch-case语句。Switch语句是一个控制语句,通过将控制传递给体内的一个case语句来处理多个选择或枚举

提示:按下两次tab键可以自动生成

image_1gj10bq9p1ir9ucn1g6n3i319uo13.png-72.7kB

语法格式:

  1. switch(变量或表达式)
  2. {
  3. case 1:
  4. 语句1;
  5. break;
  6. case 2:
  7. 语句2;
  8. break;
  9. .
  10. .
  11. .
  12. default:
  13. 语句n:
  14. break;
  15. }

补充说明:

switch语句基于表达式的值选择要执行的语句分支。

【1】Switch语句按照以下顺序执行

1.表达式求值

2.如果case标签后常量表达式的值恰好等于表达式的值,控制将转到匹配case标签后的语句序列

3.如果case标签后的常量表达式都不等于表达式的值,且如果存在一个default(默认)标签,则将控制语句转到default标签后的语句序列

4.如果case标签后的常量表达式都不等于表达式的值,且如果不存在default(默认)标签,则将跳出Switch语句而执行后继语句

【2】表达式所允许的数据类型:整数类型、字符类型、字符串类型、枚举类型

【3】每一个case标签后常量的数据类型要与表达式类型一致,或可以隐式转换的关系。

【4】每一个case标签后常量表达式的值都不能相同,包括值相同的不同常量否则会导致编译错误无法通过

【5】一个Switch语句中最多只能有一个default标签,虽然Switch结构中case可以任意顺序放置,但是一般建议将default情况放到最后。

【6】case标签后的语句序列可以包含一条以上的执行语句,这些语句序列可以不加大括号,C#会自动顺序执行case标签后的所有执行语句。

【7】多个case可以共用一组语句语句序列

代码示例:

  1. Console.WriteLine("请输入您的考试等级");
  2. switch (Console.ReadLine())
  3. {
  4. case "A":
  5. Console.WriteLine("A的成绩在90-100之间");
  6. break;
  7. case "B":
  8. Console.WriteLine("B的成绩在80-90之间");
  9. break;
  10. case "C":
  11. Console.WriteLine("C的成绩在70-80之间");
  12. break;
  13. case "D":
  14. Console.WriteLine("D的成绩在60-70之间");
  15. break;
  16. case "E":
  17. Console.WriteLine("E的成绩 小于60分");
  18. break;
  19. default:
  20. Console.WriteLine("请按要求输入,考试等级");
  21. break;
  22. }
  23. Console.ReadKey();

多个case可以共用一组语句语句序列

  1. switch (Console.ReadLine())
  2. {
  3. case "A":
  4. case "B":
  5. case "C":
  6. case "D":
  7. Console.WriteLine("及格");
  8. break;
  9. case "E":
  10. Console.WriteLine("E的成绩 小于60分");
  11. break;
  12. default:
  13. Console.WriteLine("请按要求输入,考试等级");
  14. break;
  15. }

总结

练习题: 请用户输入某一年的年份,判断输入出是闰年还是不是闰年

提示:判断某一年是否是润年的条件:该年份能被400整除的 或 该年份能被4整除的 同时 不能被100整除

三元表达式:

  1. Console.WriteLine("请输入年份");
  2. int year = Convert.ToInt32(Console.ReadLine());
  3. bool isYear = (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
  4. string result = isYear == true ? "闰年" : "不是闰年";
  5. Console.WriteLine(result);

我们可以进行进一步的简写:

  1. Console.WriteLine("请输入年份");
  2. int year = Convert.ToInt32(Console.ReadLine());
  3. string result = (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0) ? "闰年" : "不是闰年";
  4. Console.WriteLine(result);

IF:

  1. Console.WriteLine("请输入年份");
  2. int year = Convert.ToInt32(Console.ReadLine());
  3. bool isYear = (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
  4. if (isYear==true)
  5. {
  6. Console.WriteLine("是闰年");
  7. }
  8. if (isYear==false)
  9. {
  10. Console.WriteLine("不是闰年");
  11. }
  12. Console.ReadKey();

使用IF判断的简写

  1. Console.WriteLine("请输入年份");
  2. int year = Convert.ToInt32(Console.ReadLine());
  3. bool isYear = (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
  4. if (isYear == true)Console.WriteLine("是闰年");
  5. if (isYear == false)Console.WriteLine("不是闰年");
  6. Console.ReadKey();

IF-Else:

  1. Console.WriteLine("请输入年份");
  2. int year = Convert.ToInt32(Console.ReadLine());
  3. bool isYear = (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
  4. if (isYear)
  5. {
  6. Console.WriteLine("是闰年");
  7. }
  8. else
  9. {
  10. Console.WriteLine("不是闰年");
  11. }
  12. Console.ReadKey();

IF-Else简写:

  1. Console.WriteLine("请输入年份");
  2. int year = Convert.ToInt32(Console.ReadLine());
  3. if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))
  4. Console.WriteLine("是闰年");
  5. else
  6. Console.WriteLine("不是闰年");

IF-Else-IF:

  1. //判断是否是闰年
  2. if (year % 400 == 0)
  3. {
  4. Console.WriteLine("是闰年");
  5. }
  6. else if (year % 4 == 0 && year % 100 != 0)
  7. {
  8. Console.WriteLine("是闰年");
  9. }
  10. else
  11. {
  12. Console.WriteLine("不是闰年");
  13. }

IF-Else-IF 简写:

  1. //判断某一年是否是润年的条件:该年份能被400整除 或 该年份能被4整除的 同时 不能被100整除
  2. Console.WriteLine("请输入年份");
  3. int year = Convert.ToInt32(Console.ReadLine());
  4. //判断是否是闰年
  5. if (year % 400 == 0)
  6. Console.WriteLine("是闰年");
  7. else if (year % 4 == 0 && year % 100 != 0)
  8. Console.WriteLine("是闰年");
  9. else
  10. Console.WriteLine("不是闰年");
  11. Console.ReadKey();

使用IF的嵌套:

  1. Console.WriteLine("请输入年份");
  2. int year = Convert.ToInt32(Console.ReadLine());
  3. if (year % 400 == 0)
  4. {
  5. Console.WriteLine("是闰年");
  6. }
  7. else
  8. {
  9. //判断两种情况:如果能被4整除的情况下再判断是否能被100整除
  10. if (year % 4 == 0)
  11. {
  12. if (year % 100 == 0)
  13. {
  14. Console.WriteLine("不是闰年");
  15. }
  16. else
  17. {
  18. Console.WriteLine("是闰年");
  19. }
  20. }
  21. else
  22. {
  23. //不能被4整除,说明是不是闰年
  24. Console.WriteLine("不是闰年");
  25. }
  26. }

Switch语句

  1. //输入年份与月份判断输出月份多少天
  2. Console.WriteLine("请输入年份");
  3. int year = Convert.ToInt32(Console.ReadLine());
  4. Console.WriteLine("请输入月份");
  5. int month = Convert.ToInt32(Console.ReadLine());
  6. int day = 0;
  7. switch (month)
  8. {
  9. case 1:
  10. day = 31;
  11. break;
  12. case 2:
  13. // 闰年为 29 天,不间年为 28 天
  14. bool isYear = (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
  15. if (isYear == true)
  16. {
  17. day = 29;
  18. }
  19. else
  20. {
  21. day = 28;
  22. }
  23. break;
  24. case 3:
  25. day = 31;
  26. break;
  27. case 4:
  28. day = 30;
  29. break;
  30. case 5:
  31. day = 31;
  32. break;
  33. case 6:
  34. day = 30;
  35. break;
  36. case 7:
  37. day = 31;
  38. break;
  39. case 8:
  40. day = 31;
  41. break;
  42. case 9:
  43. day = 30;
  44. break;
  45. case 10:
  46. day = 31;
  47. break;
  48. case 11:
  49. day = 30;
  50. break;
  51. case 12:
  52. day = 31;
  53. break;
  54. default:
  55. Console.WriteLine("请输入1-12月份");
  56. break;
  57. }
  58. Console.WriteLine("{0}年{1}月->有{2}日",year,month,day);
  59. Console.ReadKey();
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注