#include <stdio.h>
int main()
{
int arr[] = {1, 2, 3, 4, 5};
int *p = arr;
++*p;
p += 2;
printf("%d", *p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
prefix的优先级++大于dereferencing,因此,p现在应该指向第二个元素.因此,当我们添加2它时,它应该指向第4个元素,答案应该是4.但是,答案是3,为什么呢?
在表达式中,++*p优先级根本不起任何作用.在此表达式中,内部运算符适用于p(*在这种情况下).外部运算符(++)适用于内部运算符的结果.
如果你交换它们来获取*++p,那么++将适用于p,同时*将适用于结果++p.
每当你有一堆unary/postfix操作符位于操作数的同一侧时,它们就会以内向外的顺序应用.
对于右侧示例,在p++[i]运算符中++应用p并[i]应用于结果p++.同时,在p[i]++运营商中[i]适用p并++适用于其结果p[i].
优先权开始在"含糊不清"的情况下发挥作用,如:
一元/后缀运算符与二元运算符,例如
*p + 2
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,一元的*优先级高于二元+,导致(*p) + 2.
p->i / 5
Run Code Online (Sandbox Code Playgroud)
这里postfix的->优先级高于二进制/,导致(p->i) / 5.
一般来说,一元/后缀运算符的优先级高于二元运算符.
一元与后缀操作符,即运营商在这两个操作数,例如边
*p++
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,后缀++比一元更优先*,导致*(p++).
&p->i
Run Code Online (Sandbox Code Playgroud)
这里postfix ->比一元更优先&,导致&(p->i).
一般来说,后缀运算符的优先级高于一元运算符.
各种更"异国情调"的案例,如?:运营商...
| 归档时间: |
|
| 查看次数: |
146 次 |
| 最近记录: |