我有以下简单的代码:
#include<iostream>
const char str[]={'C','+','+'};
int main()
{
const char *cp=str;
std::cout<<*str<<std::endl;
while (*cp++>0)
std::cout<<*cp;
}
无法理解打印的原因
C
++
后缀增量运算符不应该计算表达式但返回值不变吗? (我仔细检查了增量,解引用和关系运算符的优先级,它应该有效)
答案 0 :(得分:4)
此行打印:C和回车。
std::cout<<*str<<std::endl;
然后你循环跟随字符,但没有结束字符(c.f。缓冲区溢出)
这是修复后的代码。
#include <iostream>
const char str[]={'C','+','+', '\0'};
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','+','+', '\0'};
int main()
{
const char* cp = str;
while (*cp > 0)
std::cout << *cp++;
std::cout << std::endl;
return 0;
}
答案 1 :(得分:0)
不应该使用后缀增量运算符来计算表达式但是返回值不变吗?
不,后缀运算符首先返回操作数的值,然后只增加1。
这里,
while (*cp++>0)
std::cout<<*cp;
到达std::cout<<*cp;
时,cp
的值会递增,因此结果为++
。
答案 2 :(得分:0)
你的问题在这里:
while (*cp++>0)
std::cout<<*cp;
后缀运算符在计算中使用的表达式之后递增值。这个cp
语句中有两个不同的表达式引用while
:第一个测试和增量,但第二个打印。由于第二个是单独的语句,因此当时已经发生了增量。
即。您目前正在针对'C'
进行测试,然后无论结果如何都会递增,然后通过现在递增的指针打印'+'
。如果它正在迭代一个字符串文字,这个代码也会在到达0
后递增一次,虽然你没有看到它的结果,因为它跳过了打印(因为它遍历手工创建的数组)如果没有null终止符,它实际上在这里做的是从结尾掉下来并表现出未定义的行为;这本身就是一个很大的错误,如果一个人没有,你就不能依赖于最后的零放在那里。)
答案 3 :(得分:0)
在第
行while(*cp++>0)
在评估发生后执行后增量运算符。
即。在第一次评估while条件时,cp指向C
。
所以,
*cp => 'C' which is greater than 0.
在移动到下一行之前(在循环内),执行后增量运算符,使cp指向第一行+
打印+
后,再次执行while条件,此时* cp返回'+'。从'+' > 0
开始,控件第二次进入循环。
在进入循环之前,后增量运算符再次执行,使cp指向第二个'+',打印出来。
现在,条件第三次执行。在此,*cp
返回+
。因此,控制再次进入循环。
在进入循环之前,再次执行后增量。这次,它使cp指向下一个字符,即\0
。
打印\0
,这在此代码中没有任何区别。然后,当while条件再次执行时,* cp返回\ 0,这不是&gt;所以,条件失败了。
编辑:在评论中看到您要在同一行中打印整个字符串。将循环更改为:
while(*cp > 0)
std:cout<<*cp++;