char * a[]={"abc","edf"}; 那么*a++这个操作合法吗 ++是对应操作a还是*a?

youshiyouyu 2009-08-15 08:18:51
rt
...全文
610 66 打赏 收藏 转发到动态 举报
写回复
用AI写文章
66 条回复
切换为时间正序
请发表友善的回复…
发表回复
chen_huiiii 2010-03-08
  • 打赏
  • 举报
回复
错误,因为a是地址常数。a++错误
lhslktg 2009-08-23
  • 打赏
  • 举报
回复
mark
arong1234 2009-08-16
  • 打赏
  • 举报
回复
在任何编译器中它都应该是不合法的,因为它要求++一个常量a
[Quote=引用 60 楼 unsv29 的回复:]
和编译器有关!!!

如果我写个编译器 就会认为它不合法。 如果李四写个编译器可能认为合法。

*a++ 到底是什么呢??

如果老师考你 *a++ 是怎么回事?你回答:不知道!!
[/Quote]
arong1234 2009-08-16
  • 打赏
  • 举报
回复
C中没有维数不定的数组,因此你想指向一个尺寸不固定的数组,在C、C++中是不可能的
不要尝试用这种难以理解的方式来表示数据类型,要活用typedef,如
typedef char *parray[2];
parray * pparray;
char* a[] ={"abc","def"};
pparray = a;
[Quote=引用 53 楼 leontown 的回复:]
问一个引申的问题:
如何用一个指向数组的指针表示a啊?

如下代码:
char* a[]={"abc","edf"};
char* (*parr)[] = a;
编译错误。

为什么啊?
该如何表示啊?
[/Quote]
LeonTown 2009-08-16
  • 打赏
  • 举报
回复
麻烦各位看一下53楼的问题。
谢谢!!
ylj103037496 2009-08-15
  • 打赏
  • 举报
回复
这贴子误人子弟的太多了。13楼正解。
wxdcxp 2009-08-15
  • 打赏
  • 举报
回复
*和++优先级相同,按照右结合先执行++,在执行*
hhwei1985 2009-08-15
  • 打赏
  • 举报
回复
jf
mostmark 2009-08-15
  • 打赏
  • 举报
回复
*a++ 操作不合法,++需要左值,a为数组首地址,常量,不是变量,不能成为合法左值;
*b++ 假设b为合法左值,此时求值顺序为先++,后*,可以说++优先级高于*,优先级顺序
详见K&R
mu_yang 2009-08-15
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 pmerofc 的回复:]
引用 38 楼 youshiyouyu 的回复:
一元运算优先级是从右到左 
但是 a++是后自增
这不是矛盾吗?

优先级和运算次序是两码事
[/Quote]

所谓优先级说的是运算符的运算对象是谁
不是说哪个运算先算
wanght99 2009-08-15
  • 打赏
  • 举报
回复
不矛盾
a++是一个表达式,它的作用是让a自增,并返回原来的值.
*a++ *执行的时候,a的值已经加过1了,但*的操作数是a++的返回值,即是原来a的值.
这样一来看一去就是先取*,然后地址自增的.


[Quote=引用 38 楼 youshiyouyu 的回复:]
一元运算优先级是从右到左
但是 a++是后自增
这不是矛盾吗?
[/Quote]
pengzhixi 2009-08-15
  • 打赏
  • 举报
回复
啊荣 ++优先级是要高于*的.呵呵.
luyaowei 2009-08-15
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 youshiyouyu 的回复:]
一元运算优先级是从右到左 
但是 a++是后自增
这不是矛盾吗?
[/Quote]


#include <iostream>
using namespace std;

int main() {
int i = 10;
cout << i++ << endl;
cout << i << endl;
return 0;
}

运行下上面这个代码
例如:*argv++
cout<<*argv++; //输出的是*argv的值;
而argv已经变为argv+1
arong1234 2009-08-15
  • 打赏
  • 举报
回复
当两个运算符的优先级不一样时,优先级起作用
当优先级一样时,结合顺序起作用。
*和++是同优先级的,因此更重要的是结合顺序,而由于这是右结合的,因此*a++是先执行++
[Quote=引用 41 楼 youshiyouyu 的回复:]
ls 能详细解释一下吗?
[/Quote]
youshiyouyu 2009-08-15
  • 打赏
  • 举报
回复
ls 能详细解释一下吗?
pmerOFc 2009-08-15
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 youshiyouyu 的回复:]
一元运算优先级是从右到左 
但是 a++是后自增
这不是矛盾吗?
[/Quote]
优先级和运算次序是两码事
arong1234 2009-08-15
  • 打赏
  • 举报
回复
数组名实际是一个常量,因此不可以++
argv可以是因为他是函数参数,函数参数中的数组退化为指针了,所以可以
youshiyouyu 2009-08-15
  • 打赏
  • 举报
回复
一元运算优先级是从右到左
但是 a++是后自增
这不是矛盾吗?
wyswyg63 2009-08-15
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 wyswyg63 的回复:]
char * a[]={"abc","edf"};
*a++;
运算结果等同于

*a; //取a地址的值,a是个指针数组,当前指向字符串"abc"的地址, *a为 字符'a';
a++; //对数组名做++操作,指向数组下一个成员,即字符串"edf"的地址
[/Quote]
错了,晕哦,好久没看书了。
a是指向数组第一个成员的地址,数组第一个成员是字符串"abc"的地址,所有*a为字符串"abc"的地址,**a才是字符'a';
a为数组名,是个常量,不能做++操作。只能这样
char **ptr = a;
ptr++;
pengzhixi 2009-08-15
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 fx397993401 的回复:]
是 先 *a 在 ++
[/Quote]

请先去看看优先级再说.
加载更多回复(46)

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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