指针和自增运算符
pointers and increment operator
我有以下简单的代码:
#include<iostream>
const char str[]={'C','+','+'};
int main()
{
const char *cp=str;
std::cout<<*str<<std::endl;
while (*cp++>0)
std::cout<<*cp;
}
不能理解为什么打印
C
++
后缀自增运算符不应该计算表达式,但返回值不变吗?(我仔细检查了递增,解引用和关系操作符的优先级,它应该工作)
这行打印:C和回车
std::cout<<*str<<std::endl;
然后循环以下字符,但没有结束字符(c.f.缓冲区溢出)
下面是修改后的代码。
#include <iostream>
const char str[]={'C','+','+', ' '};
int main()
{
const char* cp = str;
std::cout<< *str << std::endl;
while (*cp++ > 0)
std::cout << *cp;
return 0;
}
如果你想显示" c++ "
这段代码就更简单了#include <iostream>
const char str[]={'C','+','+', ' '};
int main()
{
const char* cp = str;
while (*cp > 0)
std::cout << *cp++;
std::cout << std::endl;
return 0;
}
你的问题在这里:
while (*cp++>0)
std::cout<<*cp;
后置运算符对后的值加1,用于计算表达式。在这个while
语句中,有两个不同的表达式指向cp
:第一个用于测试和递增,但第二个用于打印。由于第二个语句是单独的语句,因此此时已经进行了增量操作。
。当前对'C'
进行测试,然后递增,不管结果如何,然后通过现在递增的指针打印'+'
。如果它迭代一个字符串字面值,这段代码也会在到达0
后增加一次,尽管你看不到结果,因为它跳过了打印(因为它迭代了一个手工创建的数组,没有null终止符,它在这里实际做的是从末尾掉下来,并表现出未定义的行为;这本身就是一个很大的错误,如果没有0,你不能指望最后有0)
后缀自增运算符不应该评估表达式,但返回值不变?
不,后置操作符先返回操作数的值,只是加1。
,
while (*cp++>0)
std::cout<<*cp;
当到达std::cout<<*cp;
时,cp
的值被加1,因此结果为++
。
while(*cp++>0)
在求值后执行后增量操作符。
。在while条件第一次求值时,cp指向C
。
*cp => 'C' which is greater than 0.
在移动到下一行之前(在循环内),执行后增量运算符,使cp指向第一个+
输出+
后,再次执行while条件,这次*cp返回'+'。从'+' > 0
开始,控件第二次进入循环。
在进入循环之前,再次执行后自增运算符,使cp指向第二个"+",并将其打印出来。
现在,while条件执行第三次。这里,*cp
返回+
。因此,控制再次进入循环。
在进入循环之前,再次执行后递增操作。这一次,它使cp指向下一个字符,即