*buf++ = *buf + 10 - Explanation
*buf++ = *buf + 10 - Explanation
示例代码
int arr[3] = { 0, 1 };
int* buf = arr;
*buf++ = *buf + 10;
最后一个表达式的结果是buf[0] == 10
.我教它会buf[0] == 11
.
我的一所大学写了一些类似于示例代码的东西,我教它的工作方式与它不同。我想知道为什么它以这种方式工作。
我弄清楚的方法是查看运算符优先级表。在那里,它指出后缀++优先于取消引用。因此,我教导说,在operator=
buf
的左侧将指向第一个元素,但在operator=
的右侧,它将已经递增并指向第二个元素。然而,事实并非如此。
我的问题是,为什么会这样?最好是标准报价:)但是,欢迎任何解释!
您在单个序列点中多次访问和修改指针。这是未定义的行为。
更一般地说,读取和写入序列点之间的任何变量都是未定义的。在这个特定示例中有一个指针的事实就是顺便的。
为避免与指针混淆,请执行以下操作:
int i = 0;
i++ = i + 1; // UB
从逻辑上讲,右侧的i
应该是i
的"当前"值,还是修改后的值? 这就是为什么它是未定义的。 相反,请分隔代码:
int i = 0;
++i;
i = i + 1;
这是明确的,并且定义明确。
相关文章:
- 如何从Google Proto Buf消息中的属性名称中找到消息类型
- 将Windows SYSTEMTIME转换为字符串或字符buf,C++与用户的"Region and Language"格式?
- 结果是不同的;C++ 中的 recv(sock,buf,sizeof(buf),0) 和 strlen(buf)
- C 如何在写入中向BUF添加消息
- OpenCV Explanation solvenpn
- *buf++ = *buf + 10 - Explanation
- 我想从文件中读取数据块并将其存储在矢量<string> buf 中。我做错了什么?
- 如何为文本和箱缓冲区设置 WSABUF.buf
- OpenCV 错误:断言失败 (buf.data && buf.isContinu()) in cv::imdecode_, file ..\..\..\..\openCV
- GUID explanation - C++
- the use of XMLString::release( XMLCh ** buf)
- Explanation for the TEXTUREACCESSes?
- BST isBST() explanation
- cvResize Explanation, OpenCV
- 如何将Boost::asio::buffer(buf,size)与Boost绑定一起使用
- 将unsigned char *buf=NULL转换为Pascal
- (cin >> buf && !buf.empty()) 中的第二个条件是多余的吗?
- Istream::tellg()与我的自定义流buf类一起使用时返回-1
- Base*p=new(buf)Base;的含义是什么;
- Read (int fd, void *buf, size_t count):防止隐式转换