与运算符&&和或运算符||均为双目运算符。具有左结合性。非运算符!为单目运算符,具有右结合性。逻辑运算符和其它运算符优先级的关系可表示如下:

按照运算符的优先顺序可以得出:

a>b && c>d 等价于 (a>b)&&(c>d)

!b==c||d<a 等价于 ((!b)==c)||(d<a)

a+b>c&&x+y<b 等价于 ((a+b)>c)&&((x+y)<b)

但为了使你的程序容易被理解,成为较好的程序员。建议改用括号的时候还是要用括号。

逻辑运算的值

逻辑运算的值也为“真”和“假”两种,用“1”和“0 ”来表示。其求值规则如下:

  1. 与运算 &&:参与运算的两个量都为真时,结果才为真,否则为假。

例如:

5>0 && 4>2

由于 5>0 为真,4>2 也为真,相与的结果也为真。

  1. 或运算||:参与运算的两个量只要有一个为真,结果就为真。 两个量都为假时,结果为假。

例如:

5>0||5>8

由于 5>0 为真,相或的结果也就为真。

  1. 非运算!:参与运算量为真时,结果为假;参与运算量为假时,结果为真。

例如:

!(5>0) 的结果为假。

虽然C编译在给出逻辑运算值时,以“1”代表“真”,“0 ”代表“假”。 但反过来在判断一个量是为“真”还是为“假”时,以“0”代表“假”,以非“0”的数值作为“真”。例如:

由于 5 和 3 均为非“0”因此 5&&3 的值为“真”,即为 1。

又如:

5||0 的值为“真”,即为 1。

 逻辑表达式

逻辑表达式的一般形式为:

表达式 逻辑运算符 表达式

其中的表达式可以又是逻辑表达式,从而组成了嵌套的情形。

例如:

(a&&b)&&c

根据逻辑运算符的左结合性,上式也可写为:

a&&b&&c

逻辑表达式的值是式中各种逻辑运算的最后值,以“1”和“0”分别代表“真”和“假”。

赋值运算符

赋值运算符用于把表达式的结果赋予变量。下表列出了 C 语言支持的赋值运算符:

运算符 描述 实例
= 简单的赋值运算符,把右边操作数的值赋给左边操作数 C = A + B 将把 A + B 的值赋给 C
+= 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 C += A 相当于 C = C + A
-= 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 C -= A 相当于 C = C – A
*= 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 C *= A 相当于 C = C * A
/= 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 C /= A 相当于 C = C / A
%= 求模且赋值运算符,求两个操作数的模赋值给左边操作数 C %= A 相当于 C = C % A
<<= 左移且赋值运算符 C <<= 2 等同于 C = C << 2
>>= 右移且赋值运算符 C >>= 2 等同于 C = C >> 2
&= 按位与且赋值运算符 C &= 2 等同于 C = C & 2
^= 按位异或且赋值运算符 C ^= 2 等同于 C = C ^ 2
|= 按位或且赋值运算符 C |= 2 等同于 C = C | 2

赋值运算符和赋值表达式

简单赋值运算符
简单赋值运算符和表达式:简单赋值运算符记为“=”。由“= ”连接的式子称为赋值表达式。其一般形式为:

变量=表达式
例如:
x=a+b
w=sin(a)+sin(b)
y=i+++–j

赋值表达式的功能是计算表达式的值再赋予左边的变量。赋值运算符具有右结合性。因此

a=b=c=5
可理解为
a=(b=(c=5))

在其它高级语言中,赋值构成了一个语句,称为赋值语句。 而在 C 中,把“=”定义为运算符,从而组成赋值表达式。 凡是表达式可以出现的地方均可出现赋值表达式。
例如,式子:

x=(a=5)+(b=8)

是合法的。它的意义是把 5 赋予 a,8 赋予 b,再把 a,b 相加,和赋予 x,故 x 应等于 13。

在C语言中也可以组成赋值语句,按照C语言规定,任何表达式在其未尾加上分号就构成为语句。因此如
x=8;

a=b=c=5;

都是赋值语句,在前面各例中我们已大量使用过了。

复合的赋值运算符

在赋值符“ = ”之前加上其它二目运算符可构成复合赋值符。如 +=,-=,*=, /=,%=,<<=,>>=,&=,^=,|=。
构成复合赋值表达式的一般形式为:

变量 双目运算符=表达式

它等效于:

变量=变量 运算符 表达式

例如:

a+=5 等价于 a=a+5
x*=y+7 等价于 x=x*(y+7)
r%=p 等价于 r=r%p

复合赋值符这种写法,对初学者可能不习惯,但十分有利于编译处理,能提高编译效率并产生质量较高的目标代码。

例四:

#include <stdio.h>

void main()
{
   int a = 21;
   int c ;

   c =  a;
   printf("Line 1 - = operator, c-value = %d\n", c );

   c +=  a;
   printf("Line 2 - += operator, c-value = %d\n", c );

   c -=  a;
   printf("Line 3 - -= operator, c-value = %d\n", c );

   c *=  a;
   printf("Line 4 - *= operator, c-value = %d\n", c );

   c /=  a;
   printf("Line 5 - /= operator, c-value = %d\n", c );

   c  = 200;
   c %=  a;
   printf("Line 6 - %= operator, c-value = %d\n", c );

   c <<=  2;
   printf("Line 7 - <<= operator, c-value = %d\n", c );

   c >>=  2;
   printf("Line 8 - >>= operator, c-value = %d\n", c );

   c &=  2;
   printf("Line 9 - &= operator, c-value = %d\n", c );

   c ^=  2;
   printf("Line 10 - ^= operator, c-value = %d\n", c );

   c |=  2;
   printf("Line 11 - |= operator, c-value = %d\n", c );

}

逗号运算符和逗号表达式

在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接起来组成一个表达式, 称为逗号表达式。
其一般形式为:

表达式 1,表达式 2
其求值过程是分别求两个表达式的值,并以表达式 2 的值作为整个逗号表达式的值。

例五:

main()
{
   int a=2,b=4,c=6,x,y;
   y=(x=a+b);
   printf("y=%d,x=%d",y,x);
}

运算符的优先权

下列运算符优先权顺序决定程序的执行顺序

 

Operator(s) Category Description
! Unary Logical not; associativity goes right to left
++ — Unary Increment, decrement, read from right to left
* / % Math Multiplication, division, modulo
+ – Math Addition, subtraction
<< >> Binary Shift left, shift right
< > <= >= Comparison Less than, greater than, less than or equal to, greater than or
equal to
== != Comparison Is equal to, not equal to
& Binary And
^ Binary Exclusive or (XOR)
| Binary Or
&& Logical And
|| Logical Or
?: Comparison Weird if thing; associativity goes right to left
= Assignment Variable assignment operator, including the +=, *=, and all
assignment operators
, (None) The comma separates items in a for
statement; precedence from left to right

当然,如果一段程序利用括号,就先执行括号内的运算。