int main()
{
char arr[] = "geeksforgeeks";
char *ptr = arr;
while(*ptr != '\0')
++*ptr++;
printf("%s %s", arr, ptr);
getchar();
return 0;
}
while循环++ptr++
中的语句以我不理解的方式表现。应该首先评估后增量,因为它具有高优先级,第一个输出值应该是f(递增e)。但这不会发生。要理解我将语句更改为++*(ptr++)
,因此它可能会给出我期望的输出(ffltgpshfflt是我预期的输出;但是实际输出hffltgpshfflt)。但是输出仍然不会改变。 ()运算符的优先级高于预增量。但为什么输出没有改变呢?
答案 0 :(得分:1)
我们有:
++*ptr++
首先,如前所述应用后缀运算符。但是,根据后缀增量运算符的定义, ptr++
评估为ptr
并ptr
增加1
。表达式不会评估增加的值,而是评估原始值。
因此*(ptr++)
评估的值与*ptr
相同,前者也会增加ptr
。因此,在算法的第一遍中修改了数组中的第一个元素。
括号无关紧要,因为后缀增量已经优先。
如果将其替换为:
++*++ptr
你得到了
gffltgpshfflt
其中运算符的执行顺序相同;不同之处在于前缀++
与后缀++
的工作方式不同 - 它会计算增加的值。请注意,这也会混淆null终止符,因为在检查ptr
的相等性之前,0
已被修改。