*bufptr++ = c如何解释?

csy19861111 2012-09-22 12:39:00
#define N 1024
static char buffer[N];
static char *bufptr;

*bufptr++ = c;
最后一句,c陷阱与缺陷里面讲,他的意思是“先把c放到缓冲区中,然后指针增加1,又指向缓冲区中的第一个未占用的字符”,我理解的是:先把c赋给*bufptr,然后bufptr自增1.

问题如下:
1,我理解的是否正确;
2,按照运算符的优先级,应该是(*bufptr)++ = c
3,推而广之,a = b++和a = ++b到底怎么回事,我当然知道计算结果,只是不知道如何怎么给出合理解释。
...全文
708 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cao_julians 2012-09-23
  • 打赏
  • 举报
回复
关于优先级的表述中,真正按照语法定义来的话应该是
后置操作符“优先于”前置操作符----看K&R C的附录语言定义部分--
所以后置++“先且只”作用于bufptr----因为后置++的原因,等表达式完成再++

但++又可以前置、后置不分,理解为单目操作符,用单目操作符的右结合来“记忆”----相邻的两级
前置*和后置++都是单目操作符,右结合则++先----看K&R C的正文

后置操作符有:
[],(),.,->,++,--
注:()是函数调用操作符。
这里也涉及到两个操作符的记忆:
最高级的括号(),如(x+y)*y----
和函数调用操作符,如printf()----
应该分在两级,但放在一级也不会混淆----上下文(前后文字)不同
AnYidan 2012-09-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
引用 7 楼 的回复:
1,我理解的是否正确;
理解正确
2,按照运算符的优先级,应该是(*bufptr)++ = c
不清楚你是怎么按照的 正确的结合应该是 *(bufptr++)=c
3,推而广之,a = b++和a = ++b到底怎么回事,我当然知道计算结果,只是不知道如何怎么给出合理解释。
b++ 表达式的值是b 执行完毕之后 b的值+1
++b 表达式的值是b+1 执行完毕……
[/Quote]

单目运算符*和++的优先级相同,google 结合律
csy19861111 2012-09-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
1,我理解的是否正确;
理解正确
2,按照运算符的优先级,应该是(*bufptr)++ = c
不清楚你是怎么按照的 正确的结合应该是 *(bufptr++)=c
3,推而广之,a = b++和a = ++b到底怎么回事,我当然知道计算结果,只是不知道如何怎么给出合理解释。
b++ 表达式的值是b 执行完毕之后 b的值+1
++b 表达式的值是b+1 执行完毕之后 b的值+1
[/Quote]

单目运算符*和++的优先级相同,故谁在前和谁结合啊
mujiok2003 2012-09-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用 4 楼 的回复:
不要依赖于表达式的求值顺序,用简单的语句表明自己的意图,容易读,容易写,容易维护。

C/C++ code

*bufptr = c;
++bufptr;


或者
[code=C/C++]
++bufptr;
*bufptr = c;
[code]


没必要 可以LZ的写法 经得住考验
[/Quote]
这里并没有求值顺序的问题。但是简单明了总是好的,没有任何开销, 至少我们不用去记住优先级的问题。
lin5161678 2012-09-22
  • 打赏
  • 举报
回复
1,我理解的是否正确;
理解正确
2,按照运算符的优先级,应该是(*bufptr)++ = c
不清楚你是怎么按照的 正确的结合应该是 *(bufptr++)=c
3,推而广之,a = b++和a = ++b到底怎么回事,我当然知道计算结果,只是不知道如何怎么给出合理解释。
b++ 表达式的值是b 执行完毕之后 b的值+1
++b 表达式的值是b+1 执行完毕之后 b的值+1
lin5161678 2012-09-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
不要依赖于表达式的求值顺序,用简单的语句表明自己的意图,容易读,容易写,容易维护。

C/C++ code

*bufptr = c;
++bufptr;


或者
[code=C/C++]
++bufptr;
*bufptr = c;
[code]
[/Quote]

没必要 可以LZ的写法 经得住考验
自信男孩 2012-09-22
  • 打赏
  • 举报
回复
按照优先级是*(buffer++) = 2;但由于++是后增,所以是先将2赋值给buffer指向的内存单元,然后buffer指针指向下一个内存单元。
a = b++;不等于a = ++b;后增是先将b的值赋给a,然后b的值自增1,先增是想将b的值自增1,然后将新的值赋给a。这个可以通过一个小小的程序得以验证。
mujiok2003 2012-09-22
  • 打赏
  • 举报
回复
不要依赖于表达式的求值顺序,用简单的语句表明自己的意图,容易读,容易写,容易维护。

*bufptr = c;
++bufptr;

或者
[code=C/C++]
++bufptr;
*bufptr = c;
[code]
startservice 2012-09-22
  • 打赏
  • 举报
回复
1,我理解的是否正确;
应当是先把c放到缓冲区中,然后指针增加1


2,按照运算符的优先级,应该是(*bufptr)++ = c
*buffer++ = c;
++先执行,原因是单目运算符右结合,不等同(*bufptr)++ = c

3,推而广之,a = b++和a = ++b到底怎么回事,我当然知道计算结果,只是不知道如何怎么给出合理解释。
前置操作符和后置操作符的问题
SillyBenzhu 2012-09-22
  • 打赏
  • 举报
回复
我想更正的是
*buffer++ = c; 不等于 (*buffer)++ = c;

70,012

社区成员

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

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