指针和自增运算符

pointers and increment operator

本文关键字:运算符 指针      更新时间:2023-10-16

我有以下简单的代码:

#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指向下一个字符,即

打印,这在此代码中没有区别。然后,当while条件再次执行时,*cp返回,它不> 0。因此,条件失败。

Edit:在注释中看到您想在同一行中打印整个字符串。将循环改为:

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