下面这个表列举了所有逻辑运算符在各种运算情况下的结果,仔细观察会发现里面是有规律的:
运算, 结果 ,运算 ,结果
!true, false ,false && false, false
!false, true ,true || true, true
true && true, true ,true || false ,true
true && false, false ,false ||false, false
通过上面这个表我们可以得出结论:
对于&&操作, 只有当两个条件都为true时结果才为true。
对于||操作, 只要任何一个条件为true则结果为true。
示例:
using System;
namespace Test
{
class Program
{
static void Main(string[] args)
{
float price1=27.3f;//第一种商品的价格
float price2=57.0f;//第二种商品的价格
int n1=2; //第一种商品的数量
int n2=3;//第二种商品的数量
float discount=0.2f;//折扣
double total=price1 * n1 + price2 * n2;
//如果消费总额大于200或者购买的每种商品价格都超过100则打折
if(total > 200 || (price1 > 100 && price2 > 100 ))
{
total=total * (1 -discount);
Console.WriteLine("折后总消费金额为:{0}", total);
}
else
Console.WriteLine("总消费金额为:{0}",total);
}
}
}
运行结果:
折后总消费金额为:180.4799
上面的例子我们首先定义了两个价格变量和两个数量变量。价格变量定义成浮点型是因为价格很可能存在小数,数量定义成整型是因为数量只能是整数。然后我们使用算术表达式求出所有购买商品的总额, 并保存到total变量中,total变量采用double类型只是为了演示double的用法, 实际上用float型也可以。最后我们使用if语句根据条件来执行不同的代码块, 假如if语句后面的括号中关系表达式返回true,则执行折扣计算相关的代码, 如果返回false则不计算折扣直接显示消费总额。
赋值运算符
赋值运算符是给一个变量赋一个值,听起来像废话,实际上这个小小的赋值符号作用非常大,它会指示系统向变量对应的内存存入一个值。赋值运算符就是我们前面见到的“x=2”表达式中间的那个等于号。这里要注意赋值符号和“等于”号的区别,赋值运算符是一个“=”号,而两个“==”号才是我们前面介绍的关系运算中表示相等关系的“等于”号。除了基本的赋值符号外,C#中还支持复合赋值运算符号。下表中左边一列是复合赋值运算符,中间一列是示例,右边一列是与左边运算符等效的运算:
赋值运算符号, 示例 ,描述 ,赋值运算符号, 示例, 描述
=, x=2, 给x赋值2 ,/= ,x/=2 ,相当于x=x/2
+= ,x+=2, 相当于x=x+2, *= ,x*=2 相当于x=x*2
-, x-=2 ,相当于x=x-2, %= ,x%=2 ,相当于x=x%2
表中那些复合赋值运算符实际上就是后面描述部分表达式的一个缩写形式,只不过那种省略的写法执行效率比较高,这是从C语言继承下来的特性,所以提倡使用前面那种省略的写法。赋值运算符号的计算执行是从右往左进行,比如我们常见的“x=x+2”,实际上是先计算了“x+2”然后再把这个结果给x,所以运算结束后x会增加2。如果出现连写的赋值运算,则计算是从右往左逐个赋值,如:“x=y=a”,结果x、y都等于a,下面是一个经典的交换两个数的算法:
int a=1,b=2;
b=(a+b)-(a=b);
一句话执行完后a、b的值将互换,a变为2,b变为1。计算首先从右边开始,先计算左边括号里面的“a+b”,结果为3,然后计算右边括号里面的值,右边括号里面的值计算完后结果为2,同时a已经等于了2。最后,左边括号里面的结果3减去右边括号的计算结果2得到结果1,这个1赋值给b,那么b就是1了,交换完毕。从上面的例子你也不难看出,系统运算的每一步在内存中都会暂存结果。上面的两个括号的结果先计算完,然后再把这两个结果进行相减,最后将减的结果进行赋值。
我们再来看一个例子:
using System;
namespace MyTest
{
class Test
{
[STAThread]
static void Main(string[] args)
{
int number=4567;
int thousand,hundred,ten,indiv;
//反转一个四位数
thousand=number/1000;
number %= 1000;
hundred=number/100;
number %=100;
ten=number/10;
indiv=number % 10;
number=indiv * 1000 + ten * 100 + hundred * 10 + thousand;
Console.WriteLine("反转后的数是:{0}",number);
}
}
}
运行结果:
反转后的数是:7654
最后要说明的是,赋值运算右边表达式的值必须和被赋值对象数据类型相同,如:
int a=3.3f;
float b='a';
上面的第一个表达式右边是浮点型数字而左边是整型的变量,这样是违法的。同样第二条语句右边是字符,而左边是浮点型的变量,这样赋值也是不合理的。如果赋值运算两边是引用类型,那么类型也必须兼容。一般来说,你完全可以把变量当做是一个特定类型的容器,比如装番茄酱的瓶子,对此你不能将辣椒酱装到里面去,在进行赋值操作时要特别注意这一点。当然,后面我们会介绍数据类型转换的相关知识,有了数据类型转换你就可以把辣椒酱装到番茄酱瓶子里了,你就可以把浮点型赋值给整型了。
下面这个表列举了所有逻辑运算符在各种运算情况下的结果,仔细观察会发现里面是有规律的:
运算, 结果 ,运算 ,结果
!true, false ,false && false, false
!false, true ,true || true, true
true && true, true ,true || false ,true
true && false, false ,false ||false, false
通过上面这个表我们可以得出结论:
对于&&操作, 只有当两个条件都为true时结果才为true。
对于||操作, 只要任何一个条件为true则结果为true。
示例:
using System;
namespace Test
{
class Program
{
static void Main(string[] args)
{
float price1=27.3f;//第一种商品的价格
float price2=57.0f;//第二种商品的价格
int n1=2; //第一种商品的数量
int n2=3;//第二种商品的数量
float discount=0.2f;//折扣
double total=price1 * n1 + price2 * n2;
//如果消费总额大于200或者购买的每种商品价格都超过100则打折
if(total > 200 || (price1 > 100 && price2 > 100 ))
{
total=total * (1 -discount);
Console.WriteLine("折后总消费金额为:{0}", total);
}
else
Console.WriteLine("总消费金额为:{0}",total);
}
}
}
运行结果:
折后总消费金额为:180.4799
上面的例子我们首先定义了两个价格变量和两个数量变量。价格变量定义成浮点型是因为价格很可能存在小数,数量定义成整型是因为数量只能是整数。然后我们使用算术表达式求出所有购买商品的总额, 并保存到total变量中,total变量采用double类型只是为了演示double的用法, 实际上用float型也可以。最后我们使用if语句根据条件来执行不同的代码块, 假如if语句后面的括号中关系表达式返回true,则执行折扣计算相关的代码, 如果返回false则不计算折扣直接显示消费总额。
赋值运算符
赋值运算符是给一个变量赋一个值,听起来像废话,实际上这个小小的赋值符号作用非常大,它会指示系统向变量对应的内存存入一个值。赋值运算符就是我们前面见到的“x=2”表达式中间的那个等于号。这里要注意赋值符号和“等于”号的区别,赋值运算符是一个“=”号,而两个“==”号才是我们前面介绍的关系运算中表示相等关系的“等于”号。除了基本的赋值符号外,C#中还支持复合赋值运算符号。下表中左边一列是复合赋值运算符,中间一列是示例,右边一列是与左边运算符等效的运算:
赋值运算符号, 示例 ,描述 ,赋值运算符号, 示例, 描述
=, x=2, 给x赋值2 ,/= ,x/=2 ,相当于x=x/2
+= ,x+=2, 相当于x=x+2, *= ,x*=2 相当于x=x*2
-, x-=2 ,相当于x=x-2, %= ,x%=2 ,相当于x=x%2
表中那些复合赋值运算符实际上就是后面描述部分表达式的一个缩写形式,只不过那种省略的写法执行效率比较高,这是从C语言继承下来的特性,所以提倡使用前面那种省略的写法。赋值运算符号的计算执行是从右往左进行,比如我们常见的“x=x+2”,实际上是先计算了“x+2”然后再把这个结果给x,所以运算结束后x会增加2。如果出现连写的赋值运算,则计算是从右往左逐个赋值,如:“x=y=a”,结果x、y都等于a,下面是一个经典的交换两个数的算法:
int a=1,b=2;
b=(a+b)-(a=b);
一句话执行完后a、b的值将互换,a变为2,b变为1。计算首先从右边开始,先计算左边括号里面的“a+b”,结果为3,然后计算右边括号里面的值,右边括号里面的值计算完后结果为2,同时a已经等于了2。最后,左边括号里面的结果3减去右边括号的计算结果2得到结果1,这个1赋值给b,那么b就是1了,交换完毕。从上面的例子你也不难看出,系统运算的每一步在内存中都会暂存结果。上面的两个括号的结果先计算完,然后再把这两个结果进行相减,最后将减的结果进行赋值。
我们再来看一个例子:
using System;
namespace MyTest
{
class Test
{
[STAThread]
static void Main(string[] args)
{
int number=4567;
int thousand,hundred,ten,indiv;
//反转一个四位数
thousand=number/1000;
number %= 1000;
hundred=number/100;
number %=100;
ten=number/10;
indiv=number % 10;
number=indiv * 1000 + ten * 100 + hundred * 10 + thousand;
Console.WriteLine("反转后的数是:{0}",number);
}
}
}
运行结果:
反转后的数是:7654
最后要说明的是,赋值运算右边表达式的值必须和被赋值对象数据类型相同,如:
int a=3.3f;
float b='a';
上面的第一个表达式右边是浮点型数字而左边是整型的变量,这样是违法的。同样第二条语句右边是字符,而左边是浮点型的变量,这样赋值也是不合理的。如果赋值运算两边是引用类型,那么类型也必须兼容。一般来说,你完全可以把变量当做是一个特定类型的容器,比如装番茄酱的瓶子,对此你不能将辣椒酱装到里面去,在进行赋值操作时要特别注意这一点。当然,后面我们会介绍数据类型转换的相关知识,有了数据类型转换你就可以把辣椒酱装到番茄酱瓶子里了,你就可以把浮点型赋值给整型了。