第4章选择和循环结构程序设计 1)!(非)—&&(与)一(或),即“!”为三者中最 高的 (2)逻辑运算符中的“&&”和“”(低于关系运算符,“!” 高于算术运算符。 4.3.2逻辑表达式 如前所述,逻辑表达式的值应该是一个逻辑量“真”或“假” C语言编译系统在给出逻辑运算结果时,以数值1代表“真”, 以0代表“假”,但在判断一个量是否为“真”时,以0代表 “假”,以非0代表“真”。即将一个非零的数值认作为 “真”。例如: (1)若a=-3,则!a的值为0。因为a的值为非0,被认作“真”, Back “非”运算得“假”,“假”以0代表
第4章 选择和循环结构程序设计 (1)!(非)—>&&(与)—>||(或),即“!”为三者中最 高的。 (2)逻辑运算符中的“&&”和“||”低于关系运算符, “!” 高于算术运算符。 4.3.2 逻辑表达式 如前所述٫逻辑表达式的值应该是一个逻辑量“真”或“假” 。 C语言编译系统在给出逻辑运算结果时,以数值1代表“真” , 以0代表“假” ,但在判断一个量是否为“真”时,以0代表 “假” ,以非0代表“真” 。即将一个非零的数值认作为 “真” 。例如: (1)若a=-3,则!a的值为0。因为a的值为非0,被认作“真” , 对它进行“非”运算得“假” , “假”以0代表
第4章选择和循环结构程序设计 (2)若a=-5,b=-6,则a&b的值为1。因为a和b均为非0,被 认为是“真”,因此a&&b的值民为“真”,值为1。 (3)a、b值同前,a|b的值为1。 (4)a、b值同前,!a||b的值为1。 (5)-10&012的值为1 通过这几个例子可以看出,由系统给出的逻辑运算结果不是 0就是1,不可能是其他数值。而在逻辑表达式中作为参加逻 辑运算的运算对象(操作数)可以是0(“假”)或任何非0 的数值(按“真”对待)。如果在一个表达式中不同位置上 出现数值,应区分哪能些是作为数值或关系运算的对象,哪 些作为逻辑运算的对象。例如: 9>3&8284-!0 表达式自左至右扫描求解。首先处理“5>3”(因为关系运算 符优先于&)。在关系运算符两侧的5和3作为数值参加关系 Ba
第4章 选择和循环结构程序设计 (2)若a=-5,b=-6,则a&&b的值为1。因为a和b均为非0,被 认为是“真” ,因此a&&b的值民为“真” ,值为1。 (3) a、b值同前,a||b的值为1。 (4) a、b值同前,!a||b的值为1。 (5) -10&&0||2的值为1。 通过这几个例子可以看出,由系统给出的逻辑运算结果不是 0就是1,不可能是其他数值。而在逻辑表达式中作为参加逻 辑运算的运算对象(操作数)可以是0(“假”)或任何非0 的数值(按“真”对待)。如果在一个表达式中不同位置上 出现数值,应区分哪能些是作为数值或关系运算的对象,哪 些作为逻辑运算的对象。例如: 9>3&&2||8<4-!0 表达式自左至右扫描求解。首先处理“5>3”(因为关系运算 符优先于&&)。在关系运算符两侧的5和3作为数值参加关系
第4章选择和循环结构程序设计 运算,“5>3的值为1。再进行“1&&8<4-!03的运算,8的左 侧为“&&,右侧为“<”运算符,根据优先规则,应先进行 “<”的运算,即先进行“8<4-!0的运算。现在4的左侧为 “<”,右侧为“-”运算符,而“-”优先于“<”,因此应先进 行“4-!03?的运算,由于“!”的级别最高,因此先进行“!0 的运算,得到结果1。然后进行“4-1”的运算,得到结果3 再进行“8<3”的运算,得0,最后进行“1&803的运算,得0。 实际上,逻辑运算符两侧的运算对象不但可以是0和1,或者 是0和非0的整数,也可以是任何类型的数据。可以是字符型、 实型或指针型等。系统最终以0和非0来判定它们属于“真” 或“假”。例如: c&& d 的值为1(因为‘c和‘d的 ASCII值都不为0,按“真”处 理) 逻辑运算符的结合性:除!是右结合外&是和均为左结合, dk等于!(!x),ab等于(ab)lc
第4章 选择和循环结构程序设计 运算, “5>3”的值为1。再进行“1&&8<4-!0”的运算,8的左 侧为“&&” ,右侧为“<”运算符,根据优先规则,应先进行 “<”的运算,即先进行“8<4-!0”的运算。现在4的左侧为 “<” ,右侧为“-”运算符,而“-”优先于“<” ,因此应先进 行“4-!0”的运算,由于“! ”的级别最高,因此先进行“!0” 的运算,得到结果1。然后进行“4-1”的运算,得到结果3, 再进行“8<3”的运算,得0,最后进行“1&&0”的运算,得0。 实际上,逻辑运算符两侧的运算对象不但可以是0和1,或者 是0和非0的整数,也可以是任何类型的数据。可以是字符型、 实型或指针型等。系统最终以0和非0来判定它们属于“真” 或“假” 。例如: 'c'&&'d' 的值为1(因为‘ c’和‘d’的ASCII值都不为0,按“真”处 理)。 逻辑运算符的结合性:除!是右结合外٫&&和||均为左结合٫ 如:!!x等于!(!x)٫ a||b||c等于(a||b)||c
第4章选择和循环结构程序设计 程序中使用关系运算时要注意返回结果是用0、1来表示 真假值,不要用常规的数学知识去思考和理解 【例4.1】 #includesstdio. h> main dint i=7,m,n n=(3<i<6) printf( i=%d,m=%d, n=%d\n",i,m,n) return O: 程序运行结果为:i=7,m=1n=1 虽然经过!!i运算,但i本身的值并没有改变,它返回给m的只是个 中间结果.!!i=!(!7=!0=1,所以m值是1;3<i<6即3<7<6,从数学 上看这个不等式的结果应是假的,但在C语言中却是这样处理的: Ba
第4章 选择和循环结构程序设计 程序中使用关系运算时要注意返回结果是用0、1来表示 真假值٫不要用常规的数学知识去思考和理解。 【例 4.1】 #include<stdio.h> main() {int i=7٫m٫n; m=!!i; n=(3<i<6); printf(″i=%d٫m=%d٫n=%d\n″ ٫i٫m٫n); return 0;} 程序运行结果为: i=7٫m=1٫n=1 虽然经过!!i运算٫但i本身的值并没有改变٫它返回给m的只是个 中间结果.!!i=!(!7)=!0=1٫所以m值是1;3<i<6即3<7<6٫从数学 上看这个不等式的结果应是假的٫但在C语言中却是这样处理的:
第4章选择和循环结构程序设计 (3<i<6)=((3<i)<6)=(1<6)=1 事实上,在这里不论i为何值,3<i的结果一定是0或1,它们都小 于6,因此最后的结果为1,这就是n的值。 根据逻辑运算符&&和的功能及结合性,对逻辑表达式进行 求值的时候常用所谓“懒惰求值法”,即只要能判断岀逻辑表 达式的真假即停止向后进行运算.“懒惰求值法”主要指: (1)a&kb&&c:当求得a值为假时即停止对b、c的求值,因为此时 已可断定整个表达式为假了;只有当a为真时才去求b,只有当a b全为真时才去求C (2)a|bllc:当求得a值为假时即停止对b、c的求值,因为此时 已可断定整个表达式为真了;只有当a为假时才去求b,只有当a b皆假时才去求c Ba
第4章 选择和循环结构程序设计 (3<i<6)=((3<i)<6)=(1<6)=1 事实上٫在这里不论i为何值٫3<i的结果一定是0或1٫它们都小 于6٫因此最后的结果为1٫这就是n的值。 根据逻辑运算符&& 和||的功能及结合性٫对逻辑表达式进行 求值的时候٫常用所谓“懒惰求值法” ٫即只要能判断出逻辑表 达式的真假即停止向后进行运算. “懒惰求值法”主要指: (1)a&&b&&c:当求得a值为假时即停止对b、c的求值٫因为此时 已可断定整个表达式为假了 ;只有当a为真时才去求b٫只有当a 、b全为真时才去求c。 (2)a||b||c:当求得a值为假时即停止对b、c的求值٫因为此时 已可断定整个表达式为真了 ;只有当a为假时才去求b٫只有当a 、b皆假时才去求c