Pra*_*rav 13 c++ undefined-behavior language-lawyer c++03
我想知道这段代码:
int main()
{
char *p ;
char arr[100] = "Hello";
if ((p=arr)[0] == 'H') // do stuffs
}
Run Code Online (Sandbox Code Playgroud)
这段代码实际上是在C++ 03中很好地形成的吗?
我的论点是,副作用=仅在下一个序列点之后完成,并且由于我们访问p=arr代码的结果可能不是很好,因此在=和[]操作之间没有排序.
我对么?
行为在C和C++ 11中得到了很好的定义.此代码实际上源自MySQL.
Ben*_*igt 25
当然它的定义很明确.
任务何时进行并不重要p=arr.你没有评估p[0],你正在订阅结果(p=arr),这是存储的指针值p.它是否已被存储但不会改变该值,并且无论是否p已经修改,该值都是已知的.
同样,在*--p,没有未定义的行为.如果在序列点之间访问相同的变量两次(包括至少一次写入),则只有未定义的行为.但p只能访问一次,作为其一部分--p.它不会再次读取(*p),解除引用运算符应用于其结果--p是明确定义的指针值.
现在,这将是未定义的行为:
void* a;
void* p = &a;
reinterpret_cast<void**>(p = &p)[0] = 0;
Run Code Online (Sandbox Code Playgroud)
就像那样
int *pi = new int[5];
int i = **&++pi;
Run Code Online (Sandbox Code Playgroud)
应该清楚的是,preincrement的结果不是与write无序的读取,因为断言有一个种族断言++p永远不能用作rvalue,在这种情况下它必须独立于序列点之间,可以改为使用后增量.在语言中同时使用预增量和后增量没有任何好处.
| 归档时间: |
|
| 查看次数: |
617 次 |
| 最近记录: |