gpt4 book ai didi

c++ - 重新加载未定义的行为和序列点

转载 作者:可可西里 更新时间:2023-11-01 18:39:49 28 4
gpt4 key购买 nike

将此主题视为以下主题的续集:

Previous installment
Undefined behavior and sequence points

让我们重温一下这个有趣令人费解的表达方式(斜体字取自上述话题*smile*):

i += ++i;

我们说这会调用未定义的行为。我假设当这样说时,我们隐含地假设 itype 是内置类型之一。

如果i类型 是用户定义的类型怎么办?假设它的类型是 Index,它在本文后面定义(见下文)。它还会调用未定义的行为吗?

如果是,为什么?它不等同于编写 i.operator+=(i.operator++()); 或者语法上更简单的 i.add(i.inc()); 吗?或者,它们是否也调用未定义的行为?

如果不是,为什么不呢?毕竟,对象 i 在连续的序列点之间被修改了两次。请记住经验法则:an expression can modify an object's value only once between consecutive "sequence points .如果 i +=++i 是一个表达式,那么它必须调用未定义的行为。如果是这样,那么它的等价物 i.operator+=(i.operator++());i.add(i.inc()); 也必须调用 undefined-behavior这似乎是不真实的! (据我了解)

或者,i +=++i 不是一个表达式 开头?如果是,那么它是什么?表达式的定义是什么?

如果它是一个表达式,同时它的行为也是明确定义的,那么它意味着与表达式关联的序列点的数量在某种程度上取决于类型 表达式中涉及的操作数。我是否正确(甚至部分正确)?


顺便问一下,这个表达式怎么样?

//Consider two cases:
//1. If a is an array of a built-in type
//2. If a is user-defined type which overloads the subscript operator!

a[++i] = i; //Taken from the previous topic. But here type of `i` is Index.

您在回复时也必须考虑到这一点(如果您确实知道它的行为)。 :-)


++++++i;

在 C++03 中定义明确?毕竟是这个,

((i.operator++()).operator++()).operator++();

class Index
{
int state;

public:
Index(int s) : state(s) {}
Index& operator++()
{
state++;
return *this;
}
Index& operator+=(const Index & index)
{
state+= index.state;
return *this;
}
operator int()
{
return state;
}
Index & add(const Index & index)
{
state += index.state;
return *this;
}
Index & inc()
{
state++;
return *this;
}
};

最佳答案

看起来像代码

i.operator+=(i.operator ++());

在序列点方面工作得很好。 C++ ISO 标准的第 1.9.17 节说明了序列点和函数求值:

When calling a function (whether or not the function is inline), there is a sequence point after the evaluation of all function arguments (if any) which takes place before execution of any expressions or statements in the function body. There is also a sequence point after the copying of a returned value and before the execution of any expressions outside the function.

这将表明,例如,i.operator++() 作为 operator += 的参数在其评估后有一个序列点。简而言之,因为重载运算符是函数,所以适用正常的排序规则。

顺便提一下,这是个好问题!我真的很喜欢你如何强制我理解一种我已经认为我知道的语言的所有细微差别(并且认为我认为我知道)。 :-)

关于c++ - 重新加载未定义的行为和序列点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57163654/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com