Loading... # 运算符与表达式 ## 常用运算符分类 | 运算符类型 | 作用 | | -------------------- | ---------------------------------------- | | 算术运算符 | 用于处理四则运算 | | 赋值运算符 | 用于将表达式的值赋给变量 | | 比较运算符 | 用于表达式的比较,并返回一个真值或假值 | | 逻辑运算符 | 用于根据表达式的值返回真值或假值 | | 位运算符 | 用于处理数据的位运算 | | `sizeof`运算符 | 用于求字节数长度 | ## 算术运算符 | 运算符 | 术语 | 示例 | 结果 | | -------- | ------------ | ------------- | ----------- | | + | 正号 | +3 | 3 | | - | 负号 | -3 | -3 | | + | 加 | 10 + 5 | 15 | | - | 减 | 10 - 5 | 5 | | * | 乘 | 10 * 5 | 50 | | / | 除 | 10 / 5 | 2 | | % | 取模(取余) | 10 % 3 | 1 | | ++ | 前自增 | a=2; b=++a; | a=3; b=3; | | ++ | 后自增 | a=2; b=a++; | a=3; b=2; | | -- | 前自减 | a=2; b=--a; | a=1; b=1; | | -- | 后自减 | a=2; b=a--; | a=1; b=2; | 备注: * 取模只能对整数进行操作(int类型) * 前自增是在表达式之前进行++在进行表达式计算,自减同理 * 后自增先进性表达式计算在进行++操作,自减同理 ## 赋值运算符 | 运算符 | 术语 | 示例 | 结果 | | -------- | -------- | ------------ | ----------- | | = | 赋值 | a=2; b=3; | a=2; b=3; | | += | 加等于 | a=0; a+=2; | a=2; | | -= | 减等于 | a=5; a-=3; | a=2; | | *= | 乘等于 | a=2; a*=2; | a=4; | | /= | 除等于 | a=4; a/=2; | a=2; | | %= | 模等于 | a=3; a%2; | a=1; | ## 比较运算符 C 语言的比较运算中, “真”用数字“1”来表示, “假”用数字“0”来表示。 | 运算符 | 术语 | 示例 | 结果 | | -------- | ---------- | -------- | ------ | | == | 相等于 | 4 == 3 | 0 | | != | 不等于 | 4 != 3 | 1 | | < | 小于 | 4 < 3 | 0 | | > | 大于 | 4 > 3 | 1 | | <= | 小于等于 | 4 <= 3 | 0 | | >= | 大于等于 | 4 >= 1 | 1 | ## 逻辑运算符 | 运算符 | 术语 | 示例 | 结果 | | -------- | ------ | -------- | ---------------------------------------------------------- | | ! | 非 | !a | 如果a为假,则!a为真; 如果a为真,则!a为假。 | | && | 与 | a && b | 如果a和b都为真,则结果为真,否则为假。 | | || | 或 | a || b | 如果a和b有一个为真,则结果为真,二者都为假时,结果为假。 | 备注: * !非 非真为假,非假为真 * && 与 同真为真,其余为假 * 同假为假,其余为真 ### 按位与运算符(&) 参加运算的两个数,按二进制位进行 **“与”** 运算。 运算规则:只有两个数的二进制同时为1,结果才为1,否则为0。( **负数按补码形式参加按位与运算** ) 即 0 & 0= 0 ,0 & 1= 0,1 & 0= 0, 1 & 1= 1。 > 例:3 &5 即 00000011 & 00000101 = 00000001 ,所以 3 & 5的值为1。 ### 按位或运算符(|) 参加运算的两个数,按二进制位进行 **“或”** 运算。 运算规则:参加运算的两个数只要两个数中的一个为1,结果就为1。 即 0 | 0= 0 , 1 | 0= 1 , 0 | 1= 1 , 1 | 1= 1 。 > 例:2 | 4 即 00000010 | 00000100 = 00000110 ,所以2 | 4的值为 6 。 ### 异或运算符(^) 参加运算的两个数,按二进制位进行 **“异或”** 运算。 运算规则:参加运算的两个数,如果两个相应位为“ **异** ”( **值不同** ),则该位结果为1,否则为0。 即 0 ^ 0=0 , 0 ^ 1= 1 , 1 ^ 0= 1 , 1 ^ 1= 0 。 > 例:2 ^ 4 即 00000010 ^ 00000100 =00000110 ,所以 2 ^ 4 的值为6 。 ## 运算符优先级 | 优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 | | -------- | -------- | ------------------ | -------------------------- | ---------- | ------------ | | 1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | -- | | 1 | () | 圆括号 | (表达式)/函数名(形参表) | 左到右 | -- | | 1 | . | 成员选择(对象) | 对象.成员名 | 左到右 | -- | | 1 | -> | 成员选择(指针) | 对象指针->成员名 | 左到右 | -- | | | | | | | | | 2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 | | 2 | ~ | 按位取反运算符 | ~表达式 | 右到左 | 单目运算符 | | 2 | ++ | 自增运算符 | ++变量名/变量名++ | 右到左 | 单目运算符 | | 2 | -- | 自减运算符 | --变量名/变量名-- | 右到左 | 单目运算符 | | 2 | * | 取值运算符 | *指针变量 | 右到左 | 单目运算符 | | 2 | & | 取地址运算符 | &变量名 | 右到左 | 单目运算符 | | 2 | ! | 逻辑非运算符 | !表达式 | 右到左 | 单目运算符 | | 2 | (类型) | 强制类型转换 | (数据类型)表达式 | 右到左 | -- | | 2 | sizeof | 长度运算符 | sizeof(表达式) | 右到左 | -- | | | | | | | | | 3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 | | 3 | * | 乘 | 表达式*表达式 | 左到右 | 双目运算符 | | 3 | % | 余数(取模) | 整型表达式%整型表达式 | 左到右 | 双目运算符 | | | | | | | | | 4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 | | 4 | - | 减 | 表达式-表达式 | 左到右 | 双目运算符 | | | | | | | | | 5 | << | 左移 | 变量<<表达式 | 左到右 | 双目运算符 | | 5 | >> | 右移 | 变量>>表达式 | 左到右 | 双目运算符 | | | | | | | | | 6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 | | 6 | >= | 大于等于 | 表达式>=表达式 | 左到右 | 双目运算符 | | 6 | < | 小于 | 表达式<表达式 | 左到右 | 双目运算符 | | 6 | <= | 小于等于 | 表达式<=表达式 | 左到右 | 双目运算符 | | | | | | | | | 7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 | | 7 | != | 不等于 | 表达式!=表达式 | 左到右 | 双目运算符 | | | | | | | | | 8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 | | | | | | | | | 9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 | | | | | | | | | 10 | | | 按位或 | 表达式|表达式 | 左到右 | 双目运算符 | | | | | | | | | 11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 | | | | | | | | | 12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 | | | | | | | | | 13 | ?: | 条件运算符 | 表达式1?表达式2:表达式3 | 右到左 | 三目运算符 | | | | | | | | | 14 | = | 赋值运算符 | 变量=表达式 | 右到左 | -- | | 14 | /= | 除后赋值 | 变量/=表达式 | 右到左 | -- | | 14 | *= | 乘后赋值 | 变量*=表达式 | 右到左 | -- | | 14 | %= | 取模后赋值 | 变量%=表达式 | 右到左 | -- | | 14 | += | 加后赋值 | 变量+=表达式 | 右到左 | -- | | 14 | -= | 减后赋值 | 变量-=表达式 | 右到左 | -- | | 14 | <<= | 左移后赋值 | 变量<<=表达式 | 右到左 | -- | | 14 | >>= | 右移后赋值 | 变量>>=表达式 | 右到左 | -- | | 14 | &= | 按位与后赋值 | 变量&=表达式 | 右到左 | -- | | 14 | ^= | 按位异或后赋值 | 变量^=表达式 | 右到左 | -- | | 14 | |= | 按位或后赋值 | 变量|=表达式 | 右到左 | -- | | | | | | | | | 15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | -- | ## 类型转换 数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题。 **转换的方法有两种** : * 自动转换(隐式转换):遵循一定的规则,由编译系统自动完成。 * 强制类型转换:把表达式的运算结果强制转换成所需的数据类型。 **类型转换的原则** :占用内存字节数少(值域小)的类型,向占用内存字节数多(值域大)的类型转换,以保证精度不降低。 ### 隐式转换 c <pre class="highlighter-hljs language-c hljs c-like code-pre-line" highlighted="true" boxid="code-7AJCRA"><code-line class="line-numbers-rows"></code-line>#include <stdio.h> <code-line class="line-numbers-rows"></code-line> <code-line class="line-numbers-rows"></code-line>int main() { <code-line class="line-numbers-rows"></code-line> int num = 5; <code-line class="line-numbers-rows"></code-line> printf("s1=%d\n", num / 2); <code-line class="line-numbers-rows"></code-line> printf("s2=%lf\n", num / 2.0); <code-line class="line-numbers-rows"></code-line> <code-line class="line-numbers-rows"></code-line> return 0; <code-line class="line-numbers-rows"></code-line>}</pre> > 结果: c <pre class="highlighter-hljs language-c hljs c-like code-pre-line" highlighted="true" boxid="code-cG8CFC"><code-line class="line-numbers-rows"></code-line>s1=2 <code-line class="line-numbers-rows"></code-line>s2=2.500000</pre> ### 强制转换 强制类型转换指的是使用强制类型转换运算符,将一个变量或表达式转化成所需的类型 > 基本语法格式如下所示: highlighter- <pre class="highlighter-hljs hljs code-pre-line" highlighted="true" boxid="code-rkr4GE"><code-line class="line-numbers-rows"></code-line>(类型说明符)表达式</pre> c <pre class="highlighter-hljs language-c hljs c-like code-pre-line" highlighted="true" boxid="code-XTwnys"><code-line class="line-numbers-rows"></code-line>#include <stdio.h> <code-line class="line-numbers-rows"></code-line> <code-line class="line-numbers-rows"></code-line>int main() { <code-line class="line-numbers-rows"></code-line> float x = 0; <code-line class="line-numbers-rows"></code-line> int i = 0; <code-line class="line-numbers-rows"></code-line> x = 3.6f; <code-line class="line-numbers-rows"></code-line> <code-line class="line-numbers-rows"></code-line> i = x; //x为实型, i为整型,直接赋值会有警告 <code-line class="line-numbers-rows"></code-line> i = (int)x; //使用强制类型转换 <code-line class="line-numbers-rows"></code-line> <code-line class="line-numbers-rows"></code-line> printf("x=%f, i=%d\n", x, i); <code-line class="line-numbers-rows"></code-line> <code-line class="line-numbers-rows"></code-line> return 0; <code-line class="line-numbers-rows"></code-line>}</pre> > 结果: c <pre class="highlighter-hljs language-c hljs c-like code-pre-line" highlighted="true" boxid="code-ppY6Ct"><code-line class="line-numbers-rows"></code-line>x=3.600000, i=3</pre> 最后修改:2022 年 06 月 12 日 © 允许规范转载 打赏 赞赏作者 赞 如果觉得我的文章对你有用,请随意赞赏