问题是要理解标准如何定义或允许处理这些情况以及在这种特殊情况下的行为是什么,其中正在使用post / pre increment的变量在与表达式相同的语句中使用,当它被使用时作为函数调用的参数。
以示例代码
为例char a[SZ];
以下哪项是正确的?
strlcpy(&a[i++],"Text",SZ-i-1);
strlcpy(&a[i++],"Text",SZ-i);
如果
""逗号
将用于计算i ++或
&#34 ;;"分号
...
答案 0 :(得分:2)
在这种情况下,由于"逗号分隔表达式"是函数的参数(strlcpy
),表达式的评估顺序是未指定的,即使在C ++ 17中也是如此。
但是,C ++ 17保证表达式评估不会在参数之间进行交错,因此每个表达式在形成另一个表达式之前完全形成。
因此,在strlcpy(&a[i++],"Text",SZ-i)
中,您不能依赖i
的值:根据您的实施情况,它可能会表现出不同的行为。虽然它不是未定义的行为,但您知道它要么是i
的旧值,要么是旧值加一。