c语言中指针运算符*和自增运算符++的优先级

#include <stdio.h>
int main() {
int value = 4;
int *p_value = &value;
printf("(*p_value)++是%d\n", (*p_value)++);
printf("*p_value++是%d\n", *p_value++);
return 0;
}
前后打印出来的一个是乱码,有运行环境的可以运行下,然后指点下为什么不一样 ,谢谢

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

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

结合性是指具有相同优先级的操作符的运算顺序,从左至右运算称为左结合,从右至左运算称为右结合。

自增(++)和自减(--)操作符为对象加1或减1操作提供了方便简短的实现方式。它们有前置和后置两种使用形式。到目前为止,我们已经使用过前自增操作,该操作使其操作数加1,操作结果是修改后的值。

C语言运算符是说明特定操作的符号,它是构造C语言表达式的工具。C语言的运算异常丰富,除了控制语句和输入输出以外的几乎所有的基本操作都作为运算符处理。

扩展资料

运算符优先级

1、函数计算优先。

2、其次是强制类型转换。

3、自增、自减和取反次之。

4、先乘除再加减。

5、有括号先算括号内的。

6、表达式中出现连续两个运算符时最好用空格隔开,如a+++b要写成:a++ +b或a+ ++b。同一优先级的运算符,运算次序由结合方向所决定。

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-09-19
c语言中自增运算符++作为后缀的话比指针运算符*的优先级高,作为前缀的话与指针运算符*平级。

C语言的运算符主要用于构成表达式,同一个符号在不同的表达式中,其作用并不一致。下面按计算的优先顺序,分别说明不同作用的表达式。需要特别指出,在C语言标准中,并没有结合性的说法。
相同优先级运算符,从左至右依次运算。注意后缀运算优先级高于前缀。因此++i++应解释为++(i++)。
而与或非的运算优先级都不一样,因此a && b || b && c解释为(a && b)|| (b && c)
合理使用优先级可以极大简化表达式。
基本表达式 1级
基本表达式(Primary expressions),主要是用于运算符之间,做为运算数。
标识,常量,字符串文字量,优先级提升表达式最优先执行。
优先级提升表达式是指圆括号包围的表达式,如“( expression )”
后缀表达式 2级
postfix-expression [ expression ],数组下标运算。
postfix-expression (argument-expression-list),函数调用,括号内的参数可选。
postfix-expression . identifier,成员访问,
postfix-expression -> identifier,成员访问,->号之前应为指针。
postfix-expression ++,后缀自增
postfix-expression --,后缀自减
( type-name ) { initializer-list }
( type-name ) { initializer-list , } 复合初始化,C99后新增。
单目/一元运算 3级
++ unary-expression 前缀自增
-- unary-expression 前缀自减
unary-operator cast-expression 单目转型表式式, 包括 取地址& ,提领 * , 正号+ ,负号- 位反~ 逻辑否!。
sizeof unary-expression 求类型长度,对表达式求类型长度
sizeof ( type-name ) 求类型长度
强制类型表达式 4级
(type-name ) cast-expression,强制表达式成为type-name指定的类型。
乘法表达式 5级
“ * ” 乘法运算符;“ / ”除法运算符;“ % ” 取余运算符。
加法运算符 6级
“ + ”加法运算符;“ - ”减法运算符。
移位运算符 7级
<< 左移运算符;>> 右移运算符。
关系运算符 8级
<、<=、>、>=关系运算符。
相等运算符 9级
“ == ”等于运算符;“ != ”不等于运算符。
位与运算符 10级
“ & ”按位与运算符
位异或运算符 11级
“ ∧ ”按位异或运算符(Bitwiseexclusive OR operator)。
位或运算符 12 级
“ | ”按位或运算符(Bitwiseinclusive OR operator)。
逻辑与运算符 13级
“&&”逻辑与运算符。
逻辑或运算符 14 级
“ || ”逻辑或运算符。
三元条件运算符 15级
? :条件运算符。
赋值运算符 16 级
=、 +=、 -=、 *=、 /=、 %=、 &=、 ^=、 |=、 <<=、 >>=赋值运算符。
逗号运算符 17级
“,”逗号运算符。
第2个回答  推荐于2017-10-06

*p_value++等价于 *(p_value++)


printf("(*p_value)++是%d\n", (*p_value)++);

// 这一行输出的*p_value的值,也就是4,输出之后*p_value结果自增为5

printf("*p_value++是%d\n", *p_value++);

// 这一行输出的*p_value的值,也就是5,输出之后p_value结果自增


程序没有乱码:

本回答被提问者采纳
第3个回答  2015-10-06
附录C C语言运算符优先级和结合性
优先级 运算符 含义 运算类型 结合性
1 ( )
[ ]
->
, 圆括号
下标运算符
指向结构体成员运算符
结构体成员运算符 单目 自左向右
2 !
~
++ --
(类型关键字)
+ -
*
&
sizeof 逻辑非运算符
按位取反运算符
自增、自尖运算符
强制类型转换
正、负号运算符
指针运算符
地址运算符
长度运算符 单目 自右向左
3 * / % 乘、除、求余运算符 双目 自左向右
4 + - 加、减运算符 双目 自左向右
5 <<
>> 左移运算符
右移运算符 双目 自左向右
6 < <= > >= 小于、大于、小于等于、大于等于 关系 自左向右
7 = = != 等于、不等于 关系 自左向右
8 & 按位与运算符 位运算 自左向右
9 ^ 按位异或运算符 位运算 自左向右
10 | 按位或运算符 位运算 自左向右
11 && 逻辑与运算符 位运算 自左向右
12 || 逻辑或运算符 位运算 自左向右
13 ? : 条件运算符 三目 自右向左
14 = += -= *=
/= %= << = >>= &= ^= |= 赋值运算符 双目 自右向左
15 , 逗号运算 顺序 自左向右
第4个回答  2013-03-14
因为指针地址自增之后,打印的是内存一块未分配地区,这块区域内容无法预知。
而先取值后自增,就是值得自增,不是指针地址自增。追问

谢谢

相似回答