![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
定义int a=5,b=20;若执行语句printf("%d\n",++a*- -b/5 );后,输出的结果为
展开全部
6*19/5
类别 名称 符号 对象数目 运算规则 运算对象 运算结果 优先级别 结合性
强制运算符圆括号 () 单目 参数表 任何类型 任何类型 15 自左向右
下标运算符方括号 [] 单目 数组下标 任何类型 任何类型 15 自左向右
成员运算符圆点 · 单目 结构成员符 任何类型 任何类型 15 自左向右
成员运算符左箭头 <- 单目 共用成员符 任何类型 任何类型 15 自左向右
算术运算符正 + 单目 取原值 整型或实型 整型或实型 14 自右向左
算术运算符 负 - 单目 取负值 整型或实型 整型或实型 14 自右向左
算术运算符 加 + 双目 相加取和 整型或实型 整型或实型 12 自左向右
算术运算符 减 - 双目 相减取差 整型或实型 整型或实型 12 自左向右
算术运算符 乘 * 双目 相乘取积 整型或实型 整型或实型 13 自左向右
算术运算符 除 / 双目 相除取整商 整型或实型 整型或实型 13 自左向右
算术运算符 模 % 双目 整除取余 整型 整型 13 自左向右
算术运算符增1(前缀) ++ 单目 先加1 整字指变数 同左 14 自右向左
算术运算符增1(后缀) ++ 单目 后加1 整字指变数 同左 14 自右向左
算术运算符减1(前缀) -- 单目 先减1 整字指变数 同左 14 自右向左
算术运算符减1(后缀) -- 单目 后减1 整字指变数 同左 14 自右向左
关系运算符小于 < 双目 真为1假为0 整实和字符 整型逻辑值 10 自左向右
关系运算符小于或等于<= 双目 真为1假为0 整实和字符 整型逻辑值 10 自左向右
关系运算符大于 > 双目 真为1假为0 整实和字符 整型逻辑值 10 自左向右
关系运算符 大于或等于>= 双目 真为1假为0 整实和字符 整型逻辑值 10 自左向右
关系运算符 等于 = 双目 真为1假为0 整实和字符 整型逻辑值 9 自左向右
关系运算符 不等于 != 双目 真为1假为0 整实和字符 整型逻辑值 9 自左向右
逻辑运算符 逻辑非 ! 单目 逻辑值取反 数值或字符 整型逻辑值 14 自右向左
逻辑运算符 逻辑与 && 双目 有假为假 数值或字符 整型逻辑值 5 自左向右
逻辑运算符 逻辑或 || 双目 有真为真 数值或字符 整型逻辑值 4 自左向右
赋值运算符 赋值 = 双目 等于 任何类型 表达式 2 自右向左
反赋值运算 加赋值 += 双目 和入第一数 数值型 数值型 2 自右向左
反赋值运算 减赋值 -= 双目 差入第一数 数值型 数值型 2 自右向左
反赋值运算 乘赋值 *= 双目 积入第一数 数值型 数值型 2 自右向左
反赋值运算 除赋值 /= 双目 商入第一数 数值型 数值型 2 自右向左
反赋值运算 模赋值 %= 双目 余入第一数 整型 整型 2 自右向左
逗号运算符逗号 , 双目 分隔表达式 表达式 表达式类型 1 自左向右
条件运算符条件 ?: 三目 条件判断 表达式 表达式类型 3 自右向左
长度运算符长度 sizeof 单目 测试长度 说明符/变量 整型 14 无
位运算符位非 ~ 单目 逻辑位取反 整型 整型 14 自右向左 位运算符位与 & 双目 有假为假 整型 整型 8 自左向右
位运算符位或 | 双目 有真为真 整型 整型 6 自左向右
位运算符按位加 ^ 双目 同假异真 整型 整型 7 自左向右
位移位运算左移 << 双目 向左移位 整型 整型 11 自左向右
位移位运算 右移 >> 双目 向右移位 整型 整型 11 自左向右
位自反赋值位与赋值 &= 双目 同反赋值 整型 整型 2 自右向左
位自反赋值位或赋值 |= 双目 同反赋值 整型 整型 2 自右向左
位自反赋值按位加赋值 ^= 双目 同反赋值 整型 整型 2 自右向左
位自反赋值位左移赋值 <<= 双目 同反赋值 整型 整型 2 自右向左
位自反赋值位右移赋值 >>= 双目 同反赋值 整型 整型 2 自右向左
类别 名称 符号 对象数目 运算规则 运算对象 运算结果 优先级别 结合性
强制运算符圆括号 () 单目 参数表 任何类型 任何类型 15 自左向右
下标运算符方括号 [] 单目 数组下标 任何类型 任何类型 15 自左向右
成员运算符圆点 · 单目 结构成员符 任何类型 任何类型 15 自左向右
成员运算符左箭头 <- 单目 共用成员符 任何类型 任何类型 15 自左向右
算术运算符正 + 单目 取原值 整型或实型 整型或实型 14 自右向左
算术运算符 负 - 单目 取负值 整型或实型 整型或实型 14 自右向左
算术运算符 加 + 双目 相加取和 整型或实型 整型或实型 12 自左向右
算术运算符 减 - 双目 相减取差 整型或实型 整型或实型 12 自左向右
算术运算符 乘 * 双目 相乘取积 整型或实型 整型或实型 13 自左向右
算术运算符 除 / 双目 相除取整商 整型或实型 整型或实型 13 自左向右
算术运算符 模 % 双目 整除取余 整型 整型 13 自左向右
算术运算符增1(前缀) ++ 单目 先加1 整字指变数 同左 14 自右向左
算术运算符增1(后缀) ++ 单目 后加1 整字指变数 同左 14 自右向左
算术运算符减1(前缀) -- 单目 先减1 整字指变数 同左 14 自右向左
算术运算符减1(后缀) -- 单目 后减1 整字指变数 同左 14 自右向左
关系运算符小于 < 双目 真为1假为0 整实和字符 整型逻辑值 10 自左向右
关系运算符小于或等于<= 双目 真为1假为0 整实和字符 整型逻辑值 10 自左向右
关系运算符大于 > 双目 真为1假为0 整实和字符 整型逻辑值 10 自左向右
关系运算符 大于或等于>= 双目 真为1假为0 整实和字符 整型逻辑值 10 自左向右
关系运算符 等于 = 双目 真为1假为0 整实和字符 整型逻辑值 9 自左向右
关系运算符 不等于 != 双目 真为1假为0 整实和字符 整型逻辑值 9 自左向右
逻辑运算符 逻辑非 ! 单目 逻辑值取反 数值或字符 整型逻辑值 14 自右向左
逻辑运算符 逻辑与 && 双目 有假为假 数值或字符 整型逻辑值 5 自左向右
逻辑运算符 逻辑或 || 双目 有真为真 数值或字符 整型逻辑值 4 自左向右
赋值运算符 赋值 = 双目 等于 任何类型 表达式 2 自右向左
反赋值运算 加赋值 += 双目 和入第一数 数值型 数值型 2 自右向左
反赋值运算 减赋值 -= 双目 差入第一数 数值型 数值型 2 自右向左
反赋值运算 乘赋值 *= 双目 积入第一数 数值型 数值型 2 自右向左
反赋值运算 除赋值 /= 双目 商入第一数 数值型 数值型 2 自右向左
反赋值运算 模赋值 %= 双目 余入第一数 整型 整型 2 自右向左
逗号运算符逗号 , 双目 分隔表达式 表达式 表达式类型 1 自左向右
条件运算符条件 ?: 三目 条件判断 表达式 表达式类型 3 自右向左
长度运算符长度 sizeof 单目 测试长度 说明符/变量 整型 14 无
位运算符位非 ~ 单目 逻辑位取反 整型 整型 14 自右向左 位运算符位与 & 双目 有假为假 整型 整型 8 自左向右
位运算符位或 | 双目 有真为真 整型 整型 6 自左向右
位运算符按位加 ^ 双目 同假异真 整型 整型 7 自左向右
位移位运算左移 << 双目 向左移位 整型 整型 11 自左向右
位移位运算 右移 >> 双目 向右移位 整型 整型 11 自左向右
位自反赋值位与赋值 &= 双目 同反赋值 整型 整型 2 自右向左
位自反赋值位或赋值 |= 双目 同反赋值 整型 整型 2 自右向左
位自反赋值按位加赋值 ^= 双目 同反赋值 整型 整型 2 自右向左
位自反赋值位左移赋值 <<= 双目 同反赋值 整型 整型 2 自右向左
位自反赋值位右移赋值 >>= 双目 同反赋值 整型 整型 2 自右向左
展开全部
好好 把优先级复习好哈
把反汇编片段拿出来分析下给你看看吧。 :)
#include<stdio.h>
int main(void)
{
80483c4: 55 push %ebp
80483c5: 89 e5 mov %esp,%ebp
80483c7: 83 e4 f0 and $0xfffffff0,%esp
80483ca: 83 ec 20 sub $0x20,%esp
int a = 5, b = 20; /*把 0x5 压栈*/
80483cd: c7 44 24 18 05 00 00 movl $0x5,0x18(%esp)
80483d4: 00 /*把 0x14(就是20咯)压栈*/
80483d5: c7 44 24 1c 14 00 00 movl $0x14,0x1c(%esp)
80483dc: 00
printf("%d\n", ++a*--b/5);
80483dd: 83 44 24 18 01 addl $0x1,0x18(%esp) /* 这里规约为:5 +1 = 6 */
80483e2: 83 6c 24 1c 01 subl $0x1,0x1c(%esp) /* 这里规约为:20-1 = 19 */
80483e7: 8b 44 24 18 mov 0x18(%esp),%eax
80483eb: 89 c1 mov %eax,%ecx
80483ed: 0f af 4c 24 1c imul 0x1c(%esp),%ecx /* 6 * 19 = 114 */
80483f2: ba 67 66 66 66 mov $0x66666667,%edx
/*后面就是 6 * 19 / 5的式子咯 */
80483f7: 89 c8 mov %ecx,%eax
80483f9: f7 ea imul %edx
80483fb: d1 fa sar %edx
80483fd: 89 c8 mov %ecx,%eax
80483ff: c1 f8 1f sar $0x1f,%eax
8048402: 29 c2 sub %eax,%edx
8048404: b8 e4 84 04 08 mov $0x80484e4,%eax
8048409: 89 54 24 04 mov %edx,0x4(%esp)
804840d: 89 04 24 mov %eax,(%esp)
8048410: e8 df fe ff ff call 80482f4 <printf@plt> /* Call printf fuction*/
}
8048415: c9 leave
8048416: c3 ret
明白了? ++ a * -- b /5 就等价于 (++a) * (--b) / 5
结果当然是 22咯,呵呵。
BTW,不要钻这种牛角尖 ,多用括号尽量把代码写的清晰些,美观些才是王道。
GOOD LUCK! 分拿来吧:)
把反汇编片段拿出来分析下给你看看吧。 :)
#include<stdio.h>
int main(void)
{
80483c4: 55 push %ebp
80483c5: 89 e5 mov %esp,%ebp
80483c7: 83 e4 f0 and $0xfffffff0,%esp
80483ca: 83 ec 20 sub $0x20,%esp
int a = 5, b = 20; /*把 0x5 压栈*/
80483cd: c7 44 24 18 05 00 00 movl $0x5,0x18(%esp)
80483d4: 00 /*把 0x14(就是20咯)压栈*/
80483d5: c7 44 24 1c 14 00 00 movl $0x14,0x1c(%esp)
80483dc: 00
printf("%d\n", ++a*--b/5);
80483dd: 83 44 24 18 01 addl $0x1,0x18(%esp) /* 这里规约为:5 +1 = 6 */
80483e2: 83 6c 24 1c 01 subl $0x1,0x1c(%esp) /* 这里规约为:20-1 = 19 */
80483e7: 8b 44 24 18 mov 0x18(%esp),%eax
80483eb: 89 c1 mov %eax,%ecx
80483ed: 0f af 4c 24 1c imul 0x1c(%esp),%ecx /* 6 * 19 = 114 */
80483f2: ba 67 66 66 66 mov $0x66666667,%edx
/*后面就是 6 * 19 / 5的式子咯 */
80483f7: 89 c8 mov %ecx,%eax
80483f9: f7 ea imul %edx
80483fb: d1 fa sar %edx
80483fd: 89 c8 mov %ecx,%eax
80483ff: c1 f8 1f sar $0x1f,%eax
8048402: 29 c2 sub %eax,%edx
8048404: b8 e4 84 04 08 mov $0x80484e4,%eax
8048409: 89 54 24 04 mov %edx,0x4(%esp)
804840d: 89 04 24 mov %eax,(%esp)
8048410: e8 df fe ff ff call 80482f4 <printf@plt> /* Call printf fuction*/
}
8048415: c9 leave
8048416: c3 ret
明白了? ++ a * -- b /5 就等价于 (++a) * (--b) / 5
结果当然是 22咯,呵呵。
BTW,不要钻这种牛角尖 ,多用括号尽量把代码写的清晰些,美观些才是王道。
GOOD LUCK! 分拿来吧:)
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
其实等于数学表达式 6*9/5;结果就是22
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
应该是6*19/5,自增自减的运算级别高于加减乘除。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
24
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询