指针和增量运算符

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
++

后缀递增运算符不应该计算表达式但 return 值不变吗? (我仔细检查了递增、取消引用和关系运算符的优先级,它应该可以工作)

shouldn't the postfix increment operator evaluate the expression but return the value unchanged?

不是,后缀运算符returns操作数的值先加1,再加1。

这里,

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

当它达到 std::cout<<*cp; 时,cp 的值增加,因此结果 ++

你的问题在这里:

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

后缀运算符在 表达式 被计算后增加值。虽然在这个 while 语句中有两个不同的表达式引用 cp:第一个是测试和递增,但第二个是打印。由于第二个是单独的语句,此时增量已经发生了。

即您当前针对 'C' 进行测试,然后不管结果如何都递增 ,然后通过现在递增的指针打印 '+'。如果它正在迭代一个字符串文字,此代码也会在到达 0 后递增一次,尽管您看不到结果,因为它跳过了打印(因为它迭代了一个手动创建的数组,没有空终止符,它实际上在这里做的是从末尾掉下来并表现出未定义的行为;这本身就是一个很大的错误,如果没有放在那里,你不能依赖末尾有一个零。

此行打印:C 和回车 return。

std::cout<<*str<<std::endl;

然后你在后面的字符上循环但没有结束字符(c.f。缓冲区溢出)
这是修复的代码。

#include <iostream>

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

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','+','+', '[=12=]'};

int main()
{ 
    const char* cp = str;                     

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

    std::cout << std::endl;

    return 0;
}

行中

while(*cp++>0)

post 增量运算符在计算发生后执行。

即cp 在 while 条件的第一次评估期间指向 C

所以,

*cp => 'C' which is greater than 0.

在移动到下一行之前(在循环内),执行 post 增量运算符,使 cp 指向第一个 +

打印完+后,再次执行while条件,这次是*cp returns '+'。自'+' > 0以来,控件第二次进入循环。

在进入循环之前,post 增量运算符再次执行,使 cp 指向打印的第二个 '+'。

现在,第三次执行while条件。这里,*cpreturns+。于是,控制再次进入循环。

在进入循环之前,postincrement再次执行。这次,它使 cp 指向下一个字符,即 [=19=]

打印的是[=19=],这段代码没有区别。然后,当while条件再次执行时,*cp returns \0,不是>0。所以,条件失败。

编辑: 在评论中看到您想在同一行中打印整个字符串。将循环更改为:

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