|
嗨喽,大家好,我是程序猿老王,程序猿老王就是我。
今天给大家讲一讲C语言运算符和表达式。
C语言运算符和表达式用于执行计算和操作,是编程中重要的基本组成部分。
一、背景
C语言的设计者在设计语言时考虑了程序员的需求,因此C语言的运算符和表达式非常灵活,可以用于不同类型的操作。C语言提供了多种类型的运算符,例如算术运算符、关系运算符、逻辑运算符、位运算符等。这些运算符可以用于执行不同类型的操作,例如基本的数学运算、逻辑运算、位运算等。
二、运算符
·算术运算符
算术运算符用于执行基本的数学运算
运算符 | 描述 | 举例 | + | 加法运算符 | a + b | - | 减法运算符 | a - b | * | 乘法运算符 | a * b | / | 除法运算符(取商) | a / b | % | 取模运算符(取余) | a % b | 举例:
int a = 10;
int b = 5;
int c;
c = a + b; // c 等于 15
c = a - b; // c 等于 5
c = a * b; // c 等于 50
c = a / b; // c 等于 2
c = a % b; // c 等于 0需要注意的是,除数不能为 0,否则会出现运行时错误。
·关系运算符
关系运算符用于比较两个值之间的关系,返回真或假的结果
运算符 | 描述 | 举例 | == | 如果两个值相等,则返回真 | a == b | != | 如果两个值不相等,则返回真 | a != b | > | 如果左边的值大于右边的值,则返回真 | a > b | < | 如果左边的值小于右边的值,则返回真 | a < b | >= | 如果左边的值大于或等于右边的值,则返回真 | a >= b | <= | 如果左边的值小于或等于右边的值,则返回真 | a <= b | 举例:
int a = 10;
int b = 5;
int c;
c = a == b; // c 等于 0,因为 a 不等于 b
c = a != b; // c 等于 1,因为 a 不等于 b
c = a > b; // c 等于 1,因为 a 大于 b
c = a < b; // c 等于 0,因为 a 小于 b
c = a >= b; // c 等于 1,因为 a 大于等于 b
c = a <= b; // c 等于 0,因为 a 小于等于 b·逻辑运算符
逻辑运算符用于连接两个或多个表达式,返回真或假的结果
运算符 | 描述 | 举例 | && | 逻辑与,如果两个表达式都为真,则返回真 | (表达式) && (表达式) | || | 逻辑或,如果两个表达式有一个或两个为真,则返回真 | (表达式) || (表达式) | ! | 逻辑非,如果表达式的结果为假,则返回真 | !(表达式) | 举例:
int a = 10;
int b = 5;
int c = 1;
int d = 0;
int result1 = (a > b) && (c == 1); // result1 等于 1,因为两个表达式都为真
int result2 = (a < b) && (c == 1); // result2 等于 0,因为第一个表达式为假
int result3 = (a < b) || (c == 1); // result3 等于 1,因为第二个表达式为真
int result4 = (a < b) || (d == 1); // result4 等于 0,因为两个表达式都为假
int result5 = !(a < b); // result5 等于 1,因为表达式都为假,取反后为真
int result6 = !(a > b); // result6 等于 0,因为表达式都为真,取反后为假·位运算符
位运算符用于对整数在二进制下的位进行操作
运算符 | 描述 | 举例 | & | 按位与,如果两个数对应bit位都为1,则该bit位结果为1,否则为0 | a & b | | | 按位或,如果两个数对应bit位都为0,则该bit位结果为0,否则为1 | a | b | ^ | 按位异或,如果两个数对应bit位值不同,则该bit位结果为1,否则为0 | a ^ b | ~ | 取反,对每个bit位进行取反,0变1,1变0 | ~a | << | 左移,将左边的操作数向左移动指定的bit位数 | a << b | >> | 右移,将左边的操作数向右移动指定的bit位数 | a >> b | 举例:
int a = 12; // 二进制 1100
int b = 25; // 二进制 11001
int c;
c = a & b; // c 等于 8,因为二进制 1100 & 11001 = 1000
c = a | b; // c 等于 29,因为二进制 1100 | 11001 = 11101
c = a ^ b; // c 等于 21,因为二进制 1100 ^ 11001 = 10101
c = ~a; // c 等于 -13,因为二进制 ~1100 = -1101
c = a << 2; // c 等于 48,因为二进制 1100 左移 2 位后变为 110000
c = b >> 3; // c 等于 3,因为二进制 11001 右移 3 位后变为 11需要注意的是,位运算符只能用于整型数据类型,而且左右两边的操作数必须是同样的数据类型。
·赋值运算符
赋值运算符用于将右边的值赋给左边的变量
运算符 | 描述 | 举例 | = | 将右边的值赋给左边的变量 | a = b | += | 将左右两边的值相加,再将结果赋给左边的变量 | a += b | -= | 将左边的值减去右边的值,再将结果赋给左边的变量 | a -= b | *= | 将左右两边的值相乘,再将结果赋给左边的变量 | a *= b | /= | 将左边的值除以右边的值,再将结果赋给左边的变量 | a /= b | %= | 将左边的值取余右边的值,再将结果赋给左边的变量 | a %= b | <<= | 将左边的值左移左边的值指定的bit位数,再将结果赋给左边的变量 | a <<= b | >>= | 将左边的值左移右边的值指定的bit位数,再将结果赋给左边的变量 | a >>= b | &= | 将左边的值按位与右边的值,再将结果赋给左边的变量 | a &= b | |= | 将左边的值按位或右边的值,再将结果赋给左边的变量 | a |= b | ^= | 将左边的值按位异或右边的值,再将结果赋给左边的变量 | a ^= b | 举例:
int a = 26; //二进制 0001 1010
int b = 3; //二进制 0000 0011
a = b; //a=3, 直接将b的值赋给a
a += b; //a=29, a+b相加后的值,再赋给a
a -= b; //a=23, a-b相减后的值,再赋给a
a *= b; //a=78, a*b相乘后的值,再赋给a
a /= b; //a=8, a/b相除后的商值,再赋给a
a %= b; //a=2, a/b相除后的余数,再赋给a
a <<= b; //a=208,a(11010)左移b的值对应的数位为(11010000),再赋给a
a >>= b; //a=3, a(11010)右移b的值对应的数位为(11),再赋给a
a &= b; //a=2, a(0001 1010)和b(0000 0011)按位与后(0000 0010),再赋给a
a |= b; //a=27, a(0001 1010)和b(0000 0011)按位或后(0001 1011),再赋给a
a ^= b; //a=25, a(0001 1010)和b(0000 0011)按位异或后(0001 1001),再赋给a·条件运算符
条件运算符用于根据条件的真假来选择不同的操作
运算符 | 描述 | 举例 | ?: | 如果条件为真,则返回第一个值,否则返回第二个值 | (a > b) ? a : b | 举例:
int a = 20;
int b = 10;
int max = (a > b) ? a : b; //max = 20, 条件(a > b)为真,因此将a的值赋给max
int min = (a < b) ? a : b; //max = 10, 条件(a < b)为假,因此将b的值赋给min·逗号运算符
逗号运算符用于分隔多个表达式,返回最后一个表达式的值
运算符 | 描述 | 举例 | , | 将多个表达式组合起来,返回最后一个表达式的值 | a = 1, b = 2, c = 3 | 举例:
int a = 1, b = 2, c = 3;
int d = (a++, b++, c++, a + b + c); // d = 9,因为 a、b、c 分别加 1,然后返回 a+b+c 的·sizeof 运算符
sizeof 运算符用于返回数据类型或变量的大小
运算符 | 描述 | 举例 | sizeof | 返回数据类型或变量的大小 | sizeof(int) | 举例:
int a = 5;
printf(&#34;sizeof(a) = %d\n&#34;, sizeof(a)); //a=4 a的数据类型为int,int为4字节·类型转换运算符
类型转换运算符用于将一个数据类型转换为另一个数据类型
运算符 | 描述 | 举例 | (type) | 将一个值转换为指定的数据类型 | (float)a | 举例:
int a = 5;
printf(&#34;(float)a = %f\n&#34;, (float)a); //结果为:5.000000, 将int类型的a转换为float类型三、表达式
表达式是由运算符和操作数组成的式子,它可以计算出一个值。例如,a + b 就是一个表达式,它计算出 a 和 b 的和。
表达式可以是一个常量、一个变量、一个函数调用,或者由运算符和操作数组成的复杂式子。在 C 语言中,表达式的计算遵循一定的优先级和结合性规则。
·优先级和结合性
C 语言中的运算符按照优先级从高到低排列,同一优先级的运算符按照结合性从左往右或从右往左计算。优先级和结合性决定了表达式的计算顺序。
优先级和结合性的规则可以参考下表:
运算符 | 描述 | 结合性 | () | 圆括号 | 左->右 | [] | 方括号 | 左->右 | -> | 结构体成员访问 | 左->右 | . | 结构体成员访问 | 左->右 | ++,-- | 自增、自减 | 从右往左 | !,~,+,- | 逻辑非、按位取反、正号、负号 | 从右往左 | 以上是 C 语言中的所有运算符和表达式的详细讲解,需要注意运算符的优先级和结合性,以及常见的错误情况。在编写代码时,应该仔细阅读代码,并在测试时检查结果,以确保代码的正确性。下期再会!
<hr/> 关于更多嵌入式C语言、FreeRTOS、RT-Thread、Linux应用编程、linux驱动等相关知识,关注公众号【嵌入式Linux知识共享】,后续精彩内容及时收看了解。 |
|