C 运算符

运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 语言内置了丰富的运算符,并提供了以下类型的运算符:

  1. 算术运算符
  2. 关系运算符
  3. 逻辑运算符
  4. 位运算符
  5. 赋值运算符
  6. 杂项运算符

本章将逐一介绍算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和其他运算符。

算术运算符

下表显示了 C 语言支持的所有算术运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:

运算符 描述 实例
+ 把两个操作数相加 A + B 将得到 30
- 从第一个操作数中减去第二个操作数 A - B 将得到 -10
* 把两个操作数相乘 A * B 将得到 200
/ 分子除以分母 B / A 将得到 2
% 取模运算符,整除后的余数 B % A 将得到 0
++ 自增运算符,整数值增加 1 A++ 将得到 11
-- 自减运算符,整数值减少 1 A-- 将得到 9

实例

请看下面的实例,了解 C 语言中所有可用的算术运算符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
 
main()
{
 int a = 21;
 int b = 10;
 int c ;
 
 c = a + b;
 printf("Line 1 - c 的值是 %d\n", c );
 c = a - b;
 printf("Line 2 - c 的值是 %d\n", c );
 c = a * b;
 printf("Line 3 - c 的值是 %d\n", c );
 c = a / b;
 printf("Line 4 - c 的值是 %d\n", c );
 c = a % b;
 printf("Line 5 - c 的值是 %d\n", c );
 c = a++;
 printf("Line 6 - c 的值是 %d\n", c );
 c = a--;
 printf("Line 7 - c 的值是 %d\n", c );
 
}

当上面的代码被编译和执行时,它会产生下列结果:

1
2
3
4
5
6
7
Line 1 - c 的值是 31
Line 2 - c 的值是 11
Line 3 - c 的值是 210
Line 4 - c 的值是 2
Line 5 - c 的值是 1
Line 6 - c 的值是 21
Line 7 - c 的值是 22

关系运算符

下表显示了 C 语言支持的所有关系运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:

运算符 描述 实例
== 检查两个操作数的值是否相等,如果相等则条件为真。 (A == B) 不为真。
!= 检查两个操作数的值是否相等,如果不相等则条件为真。 (A != B) 为真。
> 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 (A > B) 不为真。
< 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 (A < B) 为真。
>= 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 (A >= B) 不为真。
<= 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 (A <= B) 为真。

实例

请看下面的实例,了解 C 语言中所有可用的关系运算符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
 
main()
{
 int a = 21;
 int b = 10;
 int c ;
 
 if( a == b )
 {
  printf("Line 1 - a 等于 b\n" );
 }
 else
 {
  printf("Line 1 - a 不等于 b\n" );
 }
 if ( a < b )
 {
  printf("Line 2 - a 小于 b\n" );
 }
 else
 {
  printf("Line 2 - a 不小于 b\n" );
 }
 if ( a > b )
 {
  printf("Line 3 - a 大于 b\n" );
 }
 else
 {
  printf("Line 3 - a 不大于 b\n" );
 }
 /* 改变 a 和 b 的值 */
 a = 5;
 b = 20;
 if ( a <= b )
 {
  printf("Line 4 - a 小于或等于 b\n" );
 }
 if ( b >= a )
 {
  printf("Line 5 - b 大于或等于 b\n" );
 }
}

当上面的代码被编译和执行时,它会产生下列结果:

1
2
3
4
5
Line 1 - a 不等于 b
Line 2 - a 不小于 b
Line 3 - a 大于 b
Line 4 - a 小于或等于 b
Line 5 - b 大于或等于 b

逻辑运算符

下表显示了 C 语言支持的所有关系逻辑运算符。假设变量 A 的值为 1,变量 B 的值为 0,则:

运算符 描述 实例
&& 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 (A && B) 为假。
|| 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 (A || B) 为真。
! 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 !(A && B) 为真。

实例

请看下面的实例,了解 C 语言中所有可用的逻辑运算符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
 
main()
{
 int a = 5;
 int b = 20;
 int c ;
 
 if ( a && b )
 {
  printf("Line 1 - 条件为真\n" );
 }
 if ( a || b )
 {
  printf("Line 2 - 条件为真\n" );
 }
 /* 改变 a 和 b 的值 */
 a = 0;
 b = 10;
 if ( a && b )
 {
  printf("Line 3 - 条件为真\n" );
 }
 else
 {
  printf("Line 3 - 条件不为真\n" );
 }
 if ( !(a && b) )
 {
  printf("Line 4 - 条件为真\n" );
 }
}

当上面的代码被编译和执行时,它会产生下列结果:

1
2
3
4
Line 1 - 条件为真
Line 2 - 条件为真
Line 3 - 条件不为真
Line 4 - 条件为真

位运算符

位运算符作用于位,并逐位执行操作。&、 | 和 ^ 的真值表如下所示:

p q p & q p | q p ^ q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:

A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A  = 1100 0011

下表显示了 C 语言支持的位运算符。假设变量 A 的值为 60,变量 B 的值为 13,则:

运算符 描述 实例
& 如果同时存在于两个操作数中,二进制 AND 运算符复制一位到结果中。 (A & B) 将得到 12,即为 0000 1100
| 如果存在于任一操作数中,二进制 OR 运算符复制一位到结果中。 (A | B) 将得到 61,即为 0011 1101
^ 如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制异或运算符复制一位到结果中。 (A ^ B) 将得到 49,即为 0011 0001
~ 二进制补码运算符是一元运算符,具有"翻转"位效果。 (~A ) 将得到 -61,即为 1100 0011,2 的补码形式,带符号的二进制数。
<< 二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 A << 2 将得到 240,即为 1111 0000
>> 二进制右移运算符。左操作数的值向右移动右操作数指定的位数。 A >> 2 将得到 15,即为 0000 1111

实例

请看下面的实例,了解 C 语言中所有可用的位运算符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
 
main()
{
 
 unsigned int a = 60;   /* 60 = 0011 1100 */
 unsigned int b = 13;   /* 13 = 0000 1101 */
 int c = 0;  
 
 c = a & b;  /* 12 = 0000 1100 */
 printf("Line 1 - c 的值是 %d\n", c );
 
 c = a | b;  /* 61 = 0011 1101 */
 printf("Line 2 - c 的值是 %d\n", c );
 
 c = a ^ b;  /* 49 = 0011 0001 */
 printf("Line 3 - c 的值是 %d\n", c );
 
 c = ~a;   /*-61 = 1100 0011 */
 printf("Line 4 - c 的值是 %d\n", c );
 
 c = a << 2;  /* 240 = 1111 0000 */
 printf("Line 5 - c 的值是 %d\n", c );
 
 c = a >> 2;  /* 15 = 0000 1111 */
 printf("Line 6 - c 的值是 %d\n", c );
}

当上面的代码被编译和执行时,它会产生下列结果:

1
2
3
4
5
6
Line 1 - c 的值是 12
Line 2 - c 的值是 61
Line 3 - c 的值是 49
Line 4 - c 的值是 -61
Line 5 - c 的值是 240
Line 6 - c 的值是 15

赋值运算符

下表列出了 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

 实例

请看下面的实例,了解 C 语言中所有可用的赋值运算符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
 
main()
{
 int a = 21;
 int c ;
 
 c = a;
 printf("Line 1 - = 运算符实例,c 的值 = %d\n", c );
 
 c += a;
 printf("Line 2 - += 运算符实例,c 的值 = %d\n", c );
 
 c -= a;
 printf("Line 3 - -= 运算符实例,c 的值 = %d\n", c );
 
 c *= a;
 printf("Line 4 - *= 运算符实例,c 的值 = %d\n", c );
 
 c /= a;
 printf("Line 5 - /= 运算符实例,c 的值 = %d\n", c );
 
 c = 200;
 c %= a;
 printf("Line 6 - %= 运算符实例,c 的值 = %d\n", c );
 
 c <<= 2;
 printf("Line 7 - <<= 运算符实例,c 的值 = %d\n", c );
 
 c >>= 2;
 printf("Line 8 - >>= 运算符实例,c 的值 = %d\n", c );
 
 c &= 2;
 printf("Line 9 - &= 运算符实例,c 的值 = %d\n", c );
 
 c ^= 2;
 printf("Line 10 - ^= 运算符实例,c 的值 = %d\n", c );
 
 c |= 2;
 printf("Line 11 - |= 运算符实例,c 的值 = %d\n", c );
 
}

当上面的代码被编译和执行时,它会产生下列结果:

1
2
3
4
5
6
7
8
9
10
11
Line 1 - = 运算符实例,c 的值 = 21
Line 2 - += 运算符实例,c 的值 = 42
Line 3 - -= 运算符实例,c 的值 = 21
Line 4 - *= 运算符实例,c 的值 = 441
Line 5 - /= 运算符实例,c 的值 = 21
Line 6 - %= 运算符实例,c 的值 = 11
Line 7 - <<= 运算符实例,c 的值 = 44
Line 8 - >>= 运算符实例,c 的值 = 11
Line 9 - &= 运算符实例,c 的值 = 2
Line 10 - ^= 运算符实例,c 的值 = 0
Line 11 - |= 运算符实例,c 的值 = 2

杂项运算符 ↦ sizeof & 三元

下表列出了 C 语言支持的其他一些重要的运算符,包括 sizeof 和 ? :。

运算符 描述 实例
sizeof() 返回变量的大小。 sizeof(a) 将返回 4,其中 a 是整数。
& 返回变量的地址。 &a; 将给出变量的实际地址。
* 指向一个变量。 *a; 将指向一个变量。
? : 条件表达式 如果条件为真 ? 则值为 X : 否则值为 Y

实例

请看下面的实例,了解 C 语言中所有可用的杂项运算符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
 
main()
{
 int a = 4;
 short b;
 double c;
 int* ptr;
 
 /* sizeof 运算符实例 */
 printf("Line 1 - 变量 a 的大小 = %d\n", sizeof(a) );
 printf("Line 2 - 变量 b 的大小 = %d\n", sizeof(b) );
 printf("Line 3 - 变量 c 的大小 = %d\n", sizeof(c) );
 
 /* & 和 * 运算符实例 */
 ptr = &a;  /* 'ptr' 现在包含 'a' 的地址 */
 printf("a 的值是 %d\n", a);
 printf("*ptr 是 %d\n", *ptr);
 
 /* 三元运算符实例 */
 a = 10;
 b = (a == 1) ? 20: 30;
 printf( "b 的值是 %d\n", b );
 
 b = (a == 10) ? 20: 30;
 printf( "b 的值是 %d\n", b );
}

当上面的代码被编译和执行时,它会产生下列结果:

1
2
3
4
a 的值是 4
*ptr 是 4
b 的值是 30
b 的值是 20

C 中的运算符优先级

运算符的优先级确定表达式中项的组合。这会影响到一个表达式如何计算。某些运算符比其他运算符有更高的优先级,例如,乘除运算符具有比加减运算符更高的优先级。

例如 x = 7 + 3 * 2,在这里,x 被赋值为 13,而不是 20,因为运算符 * 具有比 + 更高的优先级,所以首先计算乘法 3*2,然后再加上 7。

下表将按运算符优先级从高到低列出各个运算符,具有较高优先级的运算符出现在表格的上面,具有较低优先级的运算符出现在表格的下面。在表达式中,较高优先级的运算符会优先被计算。

类别  运算符  结合性 
后缀  () [] -> . ++ - -   从左到右 
一元  + - ! ~ ++ - - (type)* & sizeof  从右到左 
乘除  * / %  从左到右 
加减  + -  从左到右 
移位  << >>  从左到右 
关系  < <= > >=  从左到右 
相等  == !=  从左到右 
位与 AND  从左到右 
位异或 XOR  从左到右 
位或 OR  从左到右 
逻辑与 AND  &&  从左到右 
逻辑或 OR  ||  从左到右 
条件  ?:  从右到左 
赋值  = += -= *= /= %=>>= <<= &= ^= |=  从右到左 
逗号  从左到右 

实例

请看下面的实例,了解 C 语言中运算符的优先级:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
 
main()
{
 int a = 20;
 int b = 10;
 int c = 15;
 int d = 5;
 int e;
  
 e = (a + b) * c / d;  // ( 30 * 15 ) / 5
 printf("(a + b) * c / d 的值是 %d\n", e );
 
 e = ((a + b) * c) / d; // (30 * 15 ) / 5
 printf("((a + b) * c) / d 的值是 %d\n" , e );
 
 e = (a + b) * (c / d); // (30) * (15/5)
 printf("(a + b) * (c / d) 的值是 %d\n", e );
 
 e = a + (b * c) / d;  // 20 + (150/5)
 printf("a + (b * c) / d 的值是 %d\n" , e );
  
 return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

1
2
3
4
(a + b) * c / d 的值是 90
((a + b) * c) / d 的值是 90
(a + b) * (c / d) 的值是 90
a + (b * c) / d 的值是 50

C语言 运算符详细介绍及示例代码的更多相关文章

  1. JAVA HashMap详细介绍和示例

    http://www.jb51.net/article/42769.htm 我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap.   第1部分 HashMa ...

  2. Java Annotation认知(包括框架图、详细介绍、示例说明)

    摘要 Java Annotation是JDK5.0引入的一种注释机制. 网上很多关于Java Annotation的文章,看得人眼花缭乱.Java Annotation本来很简单的,结果说的人没说清楚 ...

  3. Java Annotation认知(包括框架图、详细介绍、示例说明)(转)

    本文转自:http://www.cnblogs.com/skywang12345/p/3344137.html 网上很多关于Java Annotation的文章,看得人眼花缭乱.Java Annota ...

  4. awk 正则表达式、正则运算符详细介绍

    前言:使用awk作为文本处理工具,正则表达式是少不了的. 要掌握这个工具的正则表达式使用.其实,我们不必单独去学习它的正则表达式.正则表达式就像一门程序语言,有自己语法规则已经表示意思. 对于不同工具 ...

  5. c语言智能指针 附完整示例代码

    是的,你没有看错, 不是c++不是c#, 就是你认识的那个c语言. 在很长一段时间里,c的内存管理问题, 层出不穷,不是编写的时候特别费劲繁琐, 就是碰到内存泄漏排查的各种困难, 特别在多线程环境下, ...

  6. 『无为则无心』Python基础 — 12、Python运算符详细介绍

    目录 1.表达式介绍 2.运算符 (1)运算符的分类 (2)算数运算符 (3)赋值运算符 (4)复合赋值运算符 (5)比较运算符 3.逻辑运算符 拓展1:数字之间的逻辑运算 拓展2:Python中逻辑 ...

  7. unity Dotween插件的简单介绍及示例代码

    unity里面做插值动画的插件有许多,比较常见的有itween.hotween.dotween.根据大家的反馈和实际体验来说,dotween插件在灵活性.稳定性.易用性上都十分突出.这里简单介绍下它的 ...

  8. Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例

    概要 这一章,我们对TreeMap进行学习.我们先对TreeMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeMap.内容包括:第1部分 TreeMap介绍第2部分 TreeMa ...

  9. TreeMap详细介绍(源码解析)和使用示例

    本文转自 http://www.cnblogs.com/skywang12345/p/3310928.html 概要 这一章,我们对TreeMap进行学习.我们先对TreeMap有个整体认识,然后再学 ...

随机推荐

  1. ARTS Week 001

    Algorithm Leetcode 1. Two Sum Given an array of integers, return indices of the two numbers such tha ...

  2. vim 中查询和转换编码

    vim中查询修改文件编码格式 set fileencoding 查看现在文本的编码 :set fenc=编码 转换当前文本的编码为指定的编码 :set enc=编码 以指定的编码显示文本,但不保存到文 ...

  3. 用python打印99乘法口诀表

    代码如下 #!/usr/bin/env python # encoding: utf-8 __author__ = 'Nicholas.Cage' i = 1 j = 1 while i <= ...

  4. SaltStack高可用multi-master-第十三篇

    multi-master官方介绍 As of Salt 0.16.0, the ability to connect minions to multiple masters has been made ...

  5. AVL模板

    感谢此博客 #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define de(x) cout &l ...

  6. webservice用cxf发布SOAP

    cxf的安装,就是把文件解压,然后配置环境变量 http://cxf.apache.org/download.html这是官网下载 解压到这里 环境变量 wsdl2java命令测试 1.新建java项 ...

  7. MU puzzle

    2017-08-06 20:49:38 writer:pprp 三种操作: 1.MUI -> MUIUI 2.MUUU -> MU 3.MUIII -> MUU 分析:有两个操作:将 ...

  8. Glibc-2.3.4编译

    $tar xf Glibc2.3.4.tar.bz2 $mkdir build_glibc $cd build_glibc ../glibc-2.3.4/configure --prefix=/too ...

  9. 使用百度地图LBS创建自定义标注

    <body> <div id="allmap"></div> <div class="sel_container" i ...

  10. codeforces103E Buying Sets

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...