指针和增量运算符

时间:2015-07-30 09:04:01

标签: c++ pointers post-increment c-strings

我有以下简单的代码:

#include<iostream>

const char str[]={'C','+','+'};

int main()
{ 
  const char *cp=str;                     
  std::cout<<*str<<std::endl;

  while (*cp++>0)  
    std::cout<<*cp;
} 

无法理解打印的原因

C
++

后缀增量运算符不应该计算表达式但返回值不变吗? (我仔细检查了增量,解引用和关系运算符的优先级,它应该有效)

4 个答案:

答案 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++;