表达式
具体的数换成相应的变量。符号换成计算机中相应的符号。
X Y Z就是要操作的数。" * " 和 " = "就是要使用的符号。
表达式是由运算符和操作数组成的。+、-、*、/、%等都是运算符,操作数包括常量、变量和表达式等。
操作数:之前讲解过的变量和常量,可以是表达式的结果来作为操作数进行运算。
Z→变量 *→运算符 X和2→操作数
表达式基本组成部分:操作数和运算符组成,其中操作数也可以是一个值表达式。
运算符


算数运算符--双目
最简单的运算符,双目运算符,对两个数进行操作。
加、减、乘、除、求余

cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 运算符
{
internal class Program
{
static void Main(string[] args)
{
/*
某学员3门课成绩如右表所示,编程实现:1、C#课和SQL课的分数之差 2、3门课的平均分
*/
int c = 89;
int CSharp=89;
int SQL = 60;
Console.WriteLine("C的成绩:" + c); //直接使用定义的变量进行输出
Console.WriteLine("C#的成绩:"+CSharp);
Console.WriteLine("SQL的成绩;"+SQL);
Console.WriteLine();//换行,对程序没有任何影响
Console.WriteLine("C#和SQL课程的分数差:" + (CSharp - SQL));//C#成绩减去SQL成绩--用减法运算符
Console.WriteLine("该学员的平均成绩:" +(c+CSharp+SQL)/3);//把他们三个成绩加起来除以三
Console.ReadLine();//定位控制台窗体程序
}
}
}
cs
class Test
{
public static void Main(String[ ] args)
{
int i = 368;
int j = 0;
int result= i/j;
}
}
C#中使用除法和求余运算符不能除以0 j的值变成不为零的整数
求余:进行相除操作得到余数。
使用%运算符时的注意事项
使用%运算符时,返回结果的符号与左操作数相同--左边操作数如果带了符号返回就是符号
如果左边变成6.5返回编程0.5
cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 运算符
{
internal class Program
{
static void Main(string[] args)
{
double i = 6.5;
int j = -2;
double result = i % j;
Console.WriteLine(result);
}
}
}
cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 运算符
{
internal class Program
{
static void Main(string[] args)
{
double i = -6.5;
int j = -2;
double result = i % j;
Console.WriteLine(result);
}
}
}
自增自减运算符--单目
对数值型变量进行加1或减1的操作。 ++ --
使用自增自减运算符时既可以放在操作数前面又可以放在操作数后面。
放操作数前面:前置增或前置减
放操作数后面:后置增或后置减
b=a++ 先把变量a的值赋值给b,再对变量a执行加1操作
b=a-- 先把变量a的值赋值给b,再对变量a进行减1操作。
b=--a 先对变量a进行减1操作,再对减1之后的值赋值给变量b
b=++a 先对a进行加1操作,再把a的值赋值给变量b

自增自减运算符放在变量前后执行顺序的区别:
后置增:先获取i的值再对变量i进行加1操作。 前置增:先对变量i进行加1操作,然后再输出它的值。
前置减:先对变量i执行减1操作,然后再输出它的值。
后置减:先获取i的值再对变量i进行减1操作。 




注:自增自减运算符不能作用于常量或表达式,只能是提示中的变量、属性或索引器。
赋值运算符--双目
cs
//什么时候用
//某班的A学员C#成绩是80分,B学员与A学员成绩相同,输出B学员成绩
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 运算符
{
internal class Program
{
static void Main(string[] args)
{
int aScore = 80; //定义一个int类型变量记录a学员成绩80分
int bScore; //先定义b学员成绩,再把a学员成绩赋值给b学员成绩
bScore = aScore; //a学员成绩给b学员成绩
Console.WriteLine(bScore); //输出
Console.ReadLine();
}
}
}

赋值运算符:a学员成绩赋值给b学员成绩空间里面。
简单使用:为变量、属性或事件等元素进行赋值用。
对两个数进行操作,赋值运算符是一种双目运算符。
C#赋值运算符分类:简单赋值运算符"="→把一个值赋给另一个值。
简单赋值运算符"="


第二行:临时变量
复合赋值运算符 += -= *= \= %=
带运算的赋值运算符,它其实是将赋值运算符与其他运算符合并成一个运算符来使用,从而同时实现两种运算符的效果。 +=:变量等于这个变量加一个值
先执行a%b再进行减3操作
cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 运算符
{
internal class Program
{
static void Main(string[] args)
{
//输出小明五年后年龄
int age = 25;
Console.WriteLine("小明今年的年龄:" +age);
Console.WriteLine("小明5年后的年龄:" + (age += 5));
Console.ReadLine();
}
}
}



优势:使用时候可以自动完成类型转换。
劣势:虽然有时候将代码显得简洁强大,多个类型不规则运算里面不推荐使用不规则复合运算符,根据实际情况而定--在以后开发中。

关系运算符--双目
比较两个变量或两个元素间相互的大小关系,返回结果是一个布尔值。
判断关系:成立返回true;不成立返回false
比较两个关系:双目运算符。
等于 == →赋值运算符一个等号表示 关系运算符两个等号表示
不等于 !=
大于 >
小于 <
大于或等于 >=
小于或等于 <=
用于后面讲的if流程控制语句用来判断里面条件是否成立里面经常用到关系运算符。

cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 运算符
{
internal class Program
{
static void Main(string[] args)
{
int num1=4, num2=7,num3 = 7;//定义三个变量用关系运算符比较三个变量之间的关系
Console.WriteLine("num1:" + num1 + "num2" + num2 + "num3" + num3); //num1是num1的变量 输出三个变量值
Console.WriteLine();//换行
//比较三个大小关系
Console.WriteLine("num1<num2的结果:" + (num1 < num2));//返回true或false结果
Console.WriteLine("num1>num2的结果:" + (num1>num2));
Console.WriteLine("num2==num3的结果:" +(num2==num3));
Console.WriteLine("num2!=num3的结果" +(num2 !=num3));
Console.WriteLine("num1>=num2的结果:" +(num1>=num2));
Console.WriteLine("num1<=num2的结果:" +(num1<=num2));
Console.ReadLine();
}
}
}
如何同时使用多个关系运算符?

从左到右进行运算,先执行num1<num2运算返回布尔值再和num3进行比较会发生错误。
cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 运算符
{
internal class Program
{
static void Main(string[] args)
{
int num1=4, num2=7, num3 = 7;//定义三个变量用关系运算符比较三个变量之间的关系
Console.WriteLine("num1:" + num1 + "num2" + num2 + "num3" + num3); //num1是num1的变量 输出三个变量值
Console.WriteLine();//换行
//比较三个大小关系
Console.WriteLine("num1<num2<num3的结果:" + ((num1 < num2)&&(num2<num3)));//返回true或false结果 &&并且返回falsea
Console.ReadLine();
}
}
}
逻辑运算符

C#中逻辑运算符:
非 ! →对一个操作数进行操作,单目运算符。 真变假,假变真
与&&(或者用着一个:&)→比较两个布尔值是只有两个布尔值都是true才会返回true,如有一个假返回false 全真才真
或|| (|)→只有两个操作数都是假的,返回值才是假的。只要有一个是true返回真。 全假才假
逻辑运算符规则:

&&与&、||与|的区别:
逻辑与:两个符号表示如果第一个操作数为false,返回结果就是false,不会判断第二个运算符是true还是false
如果使用一个符号表示逻辑与运算符,即使第一个已经是false,还会判断第二个操作数是true还是false,最后再返回false结果。两个比一个的执行效率更高。
逻辑或:只要有一个操作数是true返回结果是true,两个时第一个为true第二个不会去判断是true还是false,会直接返回true结果。
一个→第一个操作数是true,已经确定第一个返回结果是true,还是会去判断第二个是true还是false
短路运算符:第一个是true或false不会再去判断第二个,这叫短路运算符。
--推荐使用两个符号逻辑与或逻辑或运算符。
串联电路图:(两个)中间一块断电,哪个都不亮。判断到L2不亮,其它不亮。
(单个)即使L2判断出问题还是会去判断其它有没有问题。
逻辑运算符使用

cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 逻辑运算符使用
{
internal class Program
{
static void Main(string[] args)
{
//使用逻辑运算符判断用户输入的用户名和密码是否同时满足条件,如果是,输出"登录成功",否则,输出"登录失败"。
Console.WriteLine("请输入用户名:");
string name=Console.ReadLine(); //string类型变量记录记录用户输入
Console.WriteLine("请输入用户密码:");
string pwd=Console.ReadLine(); //使用string变量命名成pwd记录用户输入的密码
if (name == "mr" && pwd == "mrsoft") //两个等号,用一个发生赋值错误
{
Console.WriteLine("登录成功");
}
else
{
Console.WriteLine("登录失败");
}
Console.ReadLine();
}
}
}
位运算符 --对位的操作(有符号和无符号)
运算规则:
位与:对二进制数进行运算有一个为0返回结果就是0 两个都为1返回1
位或:相应两个二进制数有一个数为1返回值就是1
位取反:将0变1,将1变0
位异或:只要有一个不同返回值都是1
--与前面讲的逻辑与或逻辑或符号一样(程序中使用单个--位运算符,两个--逻辑运算符)

二进制数为1说明是一个负数

对简单数字进行加密时用位运算通常进行加密
--开发程序对一些简单数字密码进行加密
cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 位运算符
{
internal class Program
{
static void Main(string[] args)
{
//使用位异或运算符对纯数字的密码进行加密
Console.WriteLine("请输入密码:");
int pwd=Convert.ToInt32(Console.ReadLine()); //Console.ReadLine返回值是string类型定义int类型变量,需要一个显示类型转换用Convert这个类转换成int类型记录
Console.WriteLine("请输入加密秘钥:");
int key=Convert.ToInt32(Console.ReadLine()); //int类型变量定义key 对异或运算Console.ReadLine()
int pwdkey = pwd ^ key;//使用位异或运算符对密码进行加密,加密结果也是int类型,位运算符针对的操作对象就是整数类型 加密结果也是int类型 输入密码必须是整数类型
//pwdkey加密之后的密码,对pwd进行位异或运算
Console.WriteLine("输出加密后的密码:"+pwdkey); //对输入密码和输出秘钥进行异或运算,异或运算后的结果就是加密后的密码
}
}
}
移位运算符--左移位运算符"<<"和右移位运算符">>"
对整数类型数据位的操作。 --特殊位运算符
左移位运算符
把一个二进制数向左移动指定的位数。 操作的是两个数 双目运算符
左边溢出的数被丢弃,右边用0补上。
48左移辉空出一位,用0进行补充。高位0会被移出,0被舍弃。 左移之后是46 在48基础上左移两位,左移一位基础上再左移一位,低位0补充,高位0舍弃。 十进制192
结论:左移相当于乘以2的n次幂。
右移位运算符
将一个2进制操作数向右移动指定的位数,右边溢出的位被丢弃。 左侧填充时需注意:二进制数分为正数和负数,正数高位是0,负数高位是1,向右移如果最高位原始是0,就在最高位补充0,如果原来最高位是1就需要在最高位补充1
结论:右移相当于原始的数除以2的n次幂
程序开发中遇到表达式乘以或除以2的n次幂情况下一般采用移位运算来代替。原因:移位运算的运算速度快,一旦遇到这种情况用移位运算符来代替。
cs
using System;
using System.Collections.Generic;
using System.Data.SqlTypes;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 移位运算符
{
internal class Program
{
static void Main(string[] args)
{
int number = 368;
Console.WriteLine("number左移两位的结果:" +(368<<2));
Console.WriteLine("number右移两位的结果:" + (number >> 2));
Console.ReadLine();
}
}
}
其它特殊运算符
C#的某些运算符不能归到其它特殊的类中。
条件运算符基本使用--C#里唯一一个三目运算符,主要对三个数进行操作,用两个符号进行表示" ? : "

?和: 表示条件运算符
这个判断公式如果为真为true,返回结果1;否则返回结果2 和后面讲到的if条件语句类似。
在if条件语句里如果为真返回结果1,否则返回结果2
age>40为真返回人到中年了 否则返回这正是黄金奋斗的年龄
用字符串变量记录他的结果。
cs
using System;
using System.Collections.Generic;
using System.Data.SqlTypes;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 移位运算符
{
internal class Program
{
static void Main(string[] args)
{
int num = 368; //定义一个num类型的变量
//Console.WriteLine("number左移两位的结果:" +(368<<2));
//Console.WriteLine("number右移两位的结果:" + (number >> 2));
string result = num > 300 ? "是真的" : "是假的"; //判断num类型变量如果>300 使用条件运算符返回一个是真的;否则返回条件运算符是假的 返回值是字符串类型定义一个字符串类型变量来接收
Console.WriteLine(result); //直接输出result定义的变量
Console.ReadLine();
}
}
}
条件运算符的嵌套使用
在一个表达式当中同时使用多个条件运算符时,先执行后面条件表达式先判断a是否大于b,如果a大于b返回a,否则返回b;最后在判断x是否大于y,如果是返回x,否则返回(a>b? a : b)表达式结果。
从右向左执行,具有右结合性,先执行右边的条件表达式再往左进行执行。 嵌套使用时从右向左计算。
cs
using System;
using System.Collections.Generic;
using System.Data.SqlTypes;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 移位运算符
{
internal class Program
{
static void Main(string[] args)
{
int num = 368, num2 = 400, num3 = 500, num4 = 800; //定义一个num类型的变量
int result = num > num2 ? num3 : num4>num3? num4 : num3; //num 如果大于> num2返回 num3 否则返回num4是否大于num3 返回结果是int类型
Console.WriteLine(result); //直接输出result定义的变量
Console.ReadLine();
}
}
}

cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 使用条件运算符注意事项
{
internal class Program
{
//在C#中使用条件运算符对两个整型变量a和b进行运算,如果a>b,则得到a的值,否则,得到b的值。
static void Main(string[] args)
{
{
int a = 10, b = 5;
(a > b) ? a : b; //条件表达式不能单独作为一条C#语句,要改变他使用一个变量来记录一下它的值
//在使用条件运算符时条件运算符组成的条件表达式不能单独作为一条C#语句,必须要有一个变量来接收它的值
Console.ReadLine();
}
}
}
}
cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 使用条件运算符注意事项
{
internal class Program
{
//在C#中使用条件运算符对两个整型变量a和b进行运算,如果a>b,则得到a的值,否则,得到b的值。
static void Main(string[] args)
{
{
int a = 10, b = 5;
int result= (a > b) ? a : b; //正确代码语句
//在使用条件运算符时条件运算符组成的条件表达式不能单独作为一条C#语句,必须要有一个变量来接收它的值
Console.ReadLine();
}
}
}
}
逗号运算符
C#里,也是一种运算符起一个连接作用
结构:<表达式1> , <表达式2> ,。。。,<表达式n>
定义三个int类型,使用,运算符连接三个变量
定义两个int类型变量分别进行赋值
is运算符--主要判断对象是不是某一种指定的类型
表示是的意思。
基本语法结构:对象 is 类型 (对象是不是某种类型)
判断某一个对象是不是指定的类型,如果是返回true,否则返回false
int i=1; //定义int类型变量i赋值
bool result= i is object; //使用is运算符判断i变量是不是object类型,并且把结果使用布尔类型变量来记录。 
返回true:object是C#中所有类型的基类,判断任何类型是不是object都会返回true
cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 使用条件运算符注意事项
{
internal class Program
{
//在C#中使用条件运算符对两个整型变量a和b进行运算,如果a>b,则得到a的值,否则,得到b的值。
static void Main(string[] args)
{
string str = "123"; //定义一个string类型的变量str赋一个值
bool result = str is object; //使用布尔类型变量result记录str is object 来判断str是不是object类型
Console.WriteLine(result); //输出result
Console.ReadLine(); //返回true:object是C#中所有类型的基类,判断任何类型是不是object都会返回true
}
}
}
cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 使用条件运算符注意事项
{
internal class Program
{
//在C#中使用条件运算符对两个整型变量a和b进行运算,如果a>b,则得到a的值,否则,得到b的值。
static void Main(string[] args)
{
string str = "str"; //定义一个string类型的变量str赋一个值
bool result = str is object; //使用布尔类型变量result记录str is object 来判断str是不是object类型
Console.WriteLine(result); //输出result
Console.ReadLine(); //返回true:object是C#中所有类型的基类,判断任何类型是不是object都会返回true
}
}
}
cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 使用条件运算符注意事项
{
internal class Program
{
//在C#中使用条件运算符对两个整型变量a和b进行运算,如果a>b,则得到a的值,否则,得到b的值。
static void Main(string[] args)
{
int str = 1; //定义一个string类型的变量str赋一个值
bool result = str is object; //使用布尔类型变量result记录str is object 来判断str是不是object类型
Console.WriteLine(result); //输出result
Console.ReadLine(); //返回true:object是C#中所有类型的基类,判断任何类型是不是object都会返回true
}
}
}
运算符的优先级与结合性
使用运算符时如果一个表达式里有多个运算符,执行的先后顺序不一样。
一个表达式里里有加减乘除,先执行乘除后执行加减。 --优先级顺序
结合性:嵌套使用条件运算符时从右向左进行运算,有些运算符从左向右进行运算。 --左结合性与右结合性
运算符优先级顺序:

同一个运算符中使用单目运算符最高。赋值运算符优先级顺序最低。
红色:从右向左右结合性。 其它:从左向右进行计算--左结合性
单目、条件和赋值运算符具有右结合性(记住这几种比较特殊,其他都是左结合性)
单目运算符:!a++; 相当于:!(a++); --先计算a++再进行逻辑非计算
条件运算符:a ? b : c ? d : e; 相当于:a ? b : (c ? d : e); --嵌套使用条件运算符,先从右进行计算在执行左侧条件表达式
赋值运算符:a = b = c; 相当于:a = (b = c); --先把c的值赋值给b,再把b的值赋值给a
其它运算符左结合性--从左向右进行计算
算术运算符:a + b - c; 先执行a+b后执行减c操作。执行过程中如果遇到优先级高的先执行优先级高的运算,在执行优先级低的运算。
相当于:(a + b) - c; 
()的特殊使用
()里的优先级高,先执行();
其他作用:提高代码可阅读性。


总结:
()里面表达式永远先被执行
运算符优先级使用问题:
运算符优先级决定了运算符的优先顺序。如果执行顺序高先执行就会变成一个常量值,常量值放在赋值号左边是不可以的。 --使用各种运算符混合运算要注意
错误原因:--是一个单目运算符,优先级最高先被执行,执行完后其它赋值运算符从右向左进行计算 --执行完后变成一个常量值放在运算符的左边,运算符左边必须是变量、属性或索引器,因此发生错误。
改正参考正确答案,每一步从右往左进行运算。