同一语句中的后增量操作
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
的旧值,要么是旧值加一。
问题是了解标准如何定义或允许处理这些情况,以及在这种特殊情况下会发生什么行为,其中经历 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
的旧值,要么是旧值加一。