关于 * 与 ++ 的优先级

guangdongmutou 2010-06-25 10:46:30

函数接受一个字符串地址,并打印该字符串。
count 用于记录display被调用的次数,
如果函数调用时,传递了第二个参数,且第二个参数非0,则打印字符串count次。
#include <iostream>
#include <cstring>
using namespace std;
void display (const char *str, int =0);

int count =0;
int main()
{

char *p ="mutou";
display (p);
display (p);
display (p);
display (p);

char *pt ="123456";
display (pt, 3);

cin.get();
cin.get();
return 0;
}
void display (const char *str,int n)
{

const char *p =new char[strlen(str)+1];
p = str;

if (n != 0)
{
for (int i =0; i < count; i++){
while (*str != '\0')
cout << *str++; //讨论这个*str++的优先级
cout << endl;
str = p;
}

}
else
{
while (*str != '\0')
cout << *str++;   //同上
cout << endl;
}
count++;
}



cout << *str++;
后缀++ 优先与 * 解除引用操作符,cout是不是先把string地址递增,然后解除引用?
这么说应该是打印"utou"或"23456",可是运行结果并非这样。
...全文
466 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
tjyjx7946358 2010-06-26
  • 打赏
  • 举报
回复
后自增。虽然运算及优先,但是是后自增。
wyz007134 2010-06-26
  • 打赏
  • 举报
回复 1
const char *p =new char[strlen(str)+1];
p = str;
这么用本身没有语法问题,但是你申请了p的空间却没有释放,从你的代码要表达的意思来看,完全没必要申请空间,只是指针的移动罢了。
另外++的优先级确实高于*
*str++ 就等价于 *str;str+=1;这两句
而*++str 等价于 str+=1;*str;看顺序就应该明白了吧
Kevin_Perkins 2010-06-26
  • 打赏
  • 举报
回复
楼主可以做个实验看看。
int a[] = {0, 1};
int* pa = a;

执行以下两句:
std::cout << *++pa;
std::cout << *pa;
输出:
11
可见,前++比*优先级高。

执行以下两句:
std::cout << *pa++;
std::cout << *pa;
输出:
01
可见, 后++比*优先级高。
SunYong11 2010-06-26
  • 打赏
  • 举报
回复
const char *p =new char[strlen(str)+1];
p = str;

楼主,内存泄露啊,怎么能这样写呢~~

1、cout << *(str++);
2、cout << *str++;

这两种写法的结果是一样的。因为++运算符返回的是自增之前的值。
skyworth98 2010-06-26
  • 打赏
  • 举报
回复
sp

[Quote=引用 1 楼 brookmill 的回复:]
*str++; 从优先级来理解确实是等于 *(str++)
但是,
请体会 *(++str) 和 *(str++) 的区别
[/Quote]
cao_julians 2010-06-26
  • 打赏
  • 举报
回复
给个后++操作符重载的C++代码:
A operatot++(A& a,int)
{
A t=a; //暂存a的值:a++表达式的值
a=a+1; //副作用:通过引用作用于实际对象
return t; //返回暂存a的值,即++操作前的值作用表达式的值
}
cao_julians 2010-06-26
  • 打赏
  • 举报
回复
后++优先级高于*;但后++的操作有两个结果:1,是操作数p自己并作为表达式的值,2.是p=p+1,称为副作用。在LZ的问题中,*p++,1.*作用于表达式(p++)的值,即*p,2.副作用p++并没有影响*p操作
庄鱼 2010-06-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 guangdongmutou 的回复:]

总结下,是说 *str++ 虽然 ++ 优先级比 * 要高, 但是 ++ 是后缀递增,
所以 * 是解除递增之前的指针

对吗?

还有下面代码的注释对吗?
C/C++ code

while (*str++ != '\0')//第一个字符不等于空字符,为true。然后指针指向第二个字符
cout << *str; //由于指针刚才指向第二个字符……
[/Quote]是的
guangdongmutou 2010-06-26
  • 打赏
  • 举报
回复
现在搞明白了.呵呵.谢谢大家回贴帮忙.
[Quote=引用 17 楼 wyz007134 的回复:]
const char *p =new char[strlen(str)+1];
p = str;
这么用本身没有语法问题,但是你申请了p的空间却没有释放,从你的代码要表达的意思来看,完全没必要申请空间,只是指针的移动罢了。
另外++的优先级确实高于*
*str++ 就等价于 *str;str+=1;这两句
而*++str 等价于 str+=1;*str;看顺序就应该明白了吧
[/Quote]
guangdongmutou 2010-06-26
  • 打赏
  • 举报
回复
总结下,是说 *str++ 虽然 ++ 优先级比 * 要高, 但是 ++ 是后缀递增,
所以 * 是解除递增之前的指针

对吗?

还有下面代码的注释对吗?

while (*str++ != '\0')//第一个字符不等于空字符,为true。然后指针指向第二个字符
cout << *str; //由于指针刚才指向第二个字符,所以输出第二个字符

while (*str != '\0')//第一个字符不等于空字符,
cout << *str++;//输出第一个字符,然后指针指向第二个字符
liutengfeigo 2010-06-26
  • 打赏
  • 举报
回复
学习了~
「已注销」 2010-06-25
  • 打赏
  • 举报
回复
这个么啊?

const char *p =new char[strlen(str)+1];
p = str;

guangdongmutou 2010-06-25
  • 打赏
  • 举报
回复

#include <iostream>
#include <cstring>
using namespace std;
void display (const char *str, int =0);

int count =0;
int main()
{

char *p ="mutou";
display (p);
display (p);
display (p);
display (p);

char *pt ="123456";
display (pt, 3);

cin.get();
cin.get();
return 0;
}
void display (const char *str,int n)
{

const char *p =new char[strlen(str)+1];
p = str;

if (n != 0)
{
for (int i =0; i < count;i++){
while (*str++ != '\0')//第一个字符不等于空字符,为true。然后指针指向第二个字符
cout << *str; //由于指针刚才指向第二个字符,所以输出第二个字符
cout << endl;
str = p;
}

}
else
{
while (*str != '\0')//第一个字符不等于空字符,
cout << *str++;//输出第一个字符,然后指针指向第二个字符
cout << endl;
}
count++;
}

是这个意思吗?
yunyun1886358 2010-06-25
  • 打赏
  • 举报
回复
++的优先级是大于取值符*的
yunyun1886358 2010-06-25
  • 打赏
  • 举报
回复
*str++等价于:

首先char* strTMP = str;
然后str = str + 1;
最后表达式*str++的值等于:*strTMP,但是str递增了
guangdongmutou 2010-06-25
  • 打赏
  • 举报
回复
你错了,如果按你这么说,那运行结果怎么是"utou"和"23456"
[Quote=引用 5 楼 brookmill 的回复:]
引用 4 楼 guangdongmutou 的回复:
为什么我把后缀更改到while测试条件中,
while (*str++ != '\0')
     cout << *str;
结果又不同呢

这个执行次序是:
*str != '\0'
str++
cout << *str;
[/Quote]
brookmill 2010-06-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 guangdongmutou 的回复:]
为什么我把后缀更改到while测试条件中,
while (*str++ != '\0')
     cout << *str;
结果又不同呢
[/Quote]
这个执行次序是:
*str != '\0'
str++
cout << *str;
guangdongmutou 2010-06-25
  • 打赏
  • 举报
回复

#include <iostream>
#include <cstring>
using namespace std;
void display (const char *str, int =0);

int count =0;
int main()
{

char *p ="mutou";
display (p);
display (p);
display (p);
display (p);

char *pt ="123456";
display (pt, 3);

cin.get();
cin.get();
return 0;
}
void display (const char *str,int n)
{

const char *p =new char[strlen(str)+1];
p = str;

if (n != 0)
{
for (int i =0; i < count;i++){
while (*str++ != '\0')
cout << *str;
cout << endl;
str = p;
}

}
else
{
while (*str++ != '\0')
cout << *str;
cout << endl;
}
count++;
}


为什么我把后缀更改到while测试条件中,
while (*str++ != '\0')
     cout << *str;
结果又不同呢
brookmill 2010-06-25
  • 打赏
  • 举报
回复
后缀++ 优先与 * 解除引用操作符, 结果是++先与str结合,也就是*(str++),但不是说++先于*被执行。
这个++是后缀,是要先使用str的值,然后才给他加1
qinken547 2010-06-25
  • 打赏
  • 举报
回复
str++是后置自增运算,楼主看看后置自增运算的定义吧......
加载更多回复(1)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧