以下代码中的两个赋值之间是否存在序列点:
f(f(x=1,1),x=2);发布于 2011-09-27 19:12:45
the (draft) standard 6.5.2.2,10中的相关引用是:
未指定函数指示符、实际参数和子表达式在实际参数中的求值顺序,但在实际调用之前有一个序列点。
因此,对于您的表达式,第一个参数(特别是对f的调用)可以在第二个参数之前进行计算;例如:
(x = 1, 1), f <sp> call, (x = 2), f <sp> call或者,可以在第二个参数之后对其求值;例如:
(x = 2), (x = 1, 1), f <sp> call, f <sp> call函数调用本身可以(并且很可能会)包含更多的序列点(特别是如果它包含一条return语句)。
根据这一点,赋值之间是否存在序列点。这取决于平台(“未指明”)。
由于在第二种情况下,您在两个序列点之间为x赋值两次,因此您在这样的平台上具有未定义的行为。
发布于 2011-09-09 10:42:02
没有。在这种情况下,标准确实是模棱两可的。
如果你想确认这一点,gcc有一个非常酷的选项-Wsequence-point,在这种情况下,它会警告你,操作可能是未定义的
发布于 2011-09-27 16:27:28
在函数调用的开头和结尾都有序列点。但是,因为函数参数上的操作顺序是由实现定义的,所以不能保证f(x=1,1)将在x=2之前执行。
还要注意,函数调用中的,不是引入序列点的逗号运算符。
https://stackoverflow.com/questions/7356573
复制相似问题