int main()
{
int a=10;
int *b=&a;
int c=*b++;
printf("%d",c);
}
我知道以下程序输出10.但是根据优先级表给出了运算符http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm的优先级,post-fix ++的优先级高于=和* .so ++应先评估然后*。那么为什么程序打印输出为10?
答案 0 :(得分:3)
它具有更高的优先级,这意味着指针将增加1,而不是它指向的值。
但是增加一个是按照评估的结尾排序(这就是postfix ++的作用,而且与优先级没有直接关系),所以你从指针中得到的值是旧值:{ {1}}不是p
。有了这个指针,你取消引用它并获得a的值,即10.然后指针p+1
加1。
p
答案 1 :(得分:0)
++
的优先级高于*
,表示操作数b
首先绑定到++
int c = *(b++);
这并不意味着首先评估b++
然后取消引用评估值。
在*b++
中,++
对b
的影响与后增量运算符相同。 *b++
只是:取消引用b
的原始值,并将指针b
增加1
。
答案 2 :(得分:0)
正如您所说,++
的优先级高于*
。因此int c=*b++;
解析为int c=*(b++);
。但是,后增量运算符的结果是之前递增的值。换句话说,赋值相当于
int temp = b;
b = b + 1;
c = *temp;
答案 3 :(得分:0)
在较大表达式的上下文中进行评估后,++
将增加b
一个内存地址。
来自http://msdn.microsoft.com/en-us/library/e1e3921c.aspx:
重要的是要注意,后缀增量或减量表达式在应用相应运算符之前求值为表达式的值。在计算操作数之后发生递增或递减操作。仅当在较大表达式的上下文中发生后缀增量或减量操作时,才会出现此问题。
那么,会发生什么情况是您将修复后的增量应用于b
,但取消引用*
的原始值为b
,其指向10
}。如果您要打印b
或*b
,您会看到值和地址已更改为意外的内容。
答案 4 :(得分:0)
是的,++的优先级高于*。 所以,声明
int c=*b++;
将被评估为
int c=*(b++)
由于它是修复后的操作符,因此指针' b'首先递增,但它返回' b'的旧地址(指向存储值10的地址)。 因此,c的值为10.