同一语句中的后增量操作

postincrement operation in same statement

问题是了解标准如何定义或允许处理这些情况,以及在这种特殊情况下会发生什么行为,其中经历 post/pre 递增的变量用于与表达式相同的语句中,当它被用作函数调用的参数。

以下面的示例代码为例

char a[SZ];

以下哪项是正确的?

strlcpy(&a[i++],"Text",SZ-i-1);

strlcpy(&a[i++],"Text",SZ-i);

如果

"," comma

用于计算 i++ 或

";" semicolon

??

在这种情况下,由于 "comma separated expressions" 是函数 (strlcpy) 的参数,表达式的求值顺序是未指定的,即使在 C++17 中也是如此。 但是,C++17 保证表达式求值不会在参数之间交错,因此每个表达式在形成另一个表达式之前已经完全形成。 因此,在您的 strlcpy(&a[i++],"Text",SZ-i) 中,您不能依赖 i 的值:它可能会根据您的实现表现出不同的行为。虽然因为它不是未定义的行为,你知道它要么是 i 的旧值,要么是旧值加一。