指针和增量运算符
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条件。这里,*cp
returns+
。于是,控制再次进入循环。
在进入循环之前,postincrement再次执行。这次,它使 cp 指向下一个字符,即 [=19=]
。
打印的是[=19=]
,这段代码没有区别。然后,当while条件再次执行时,*cp returns \0,不是>0。所以,条件失败。
编辑: 在评论中看到您想在同一行中打印整个字符串。将循环更改为:
while(*cp > 0)
std:cout<<*cp++;
我有以下简单代码:
#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条件。这里,*cp
returns+
。于是,控制再次进入循环。
在进入循环之前,postincrement再次执行。这次,它使 cp 指向下一个字符,即 [=19=]
。
打印的是[=19=]
,这段代码没有区别。然后,当while条件再次执行时,*cp returns \0,不是>0。所以,条件失败。
编辑: 在评论中看到您想在同一行中打印整个字符串。将循环更改为:
while(*cp > 0)
std:cout<<*cp++;