Wikipedia在C中的序列点条目具有以下序列点:
每次与输入/输出格式相关联的转换之后
说明符。例如,在表达式printf(“foo%n%d”&a,42)中,
在计算%n之后和之前有一个序列点
打印42
但C标准也说:
函数指示符的求值顺序
参数,而实际参数中的子表达式是
未指定,但在实际调用之前有一个序列点。
对于这样的代码来说,这两点在本质上似乎是矛盾的

int i=1;
printf("%d, %d and %d\n", i++, i++, i--);

根据维基百科的条目,在每个格式说明符后面都有一个序列点,因此它将被打印如下:
1,2,3
但根据C标准中未指定的beaviour条目,它可以打印任何内容。

最佳答案

维基百科页面的措辞很糟糕。实际文本为(C11 7.21.6):
格式化的输入/输出函数的行为应如同在与每个说明符相关联的操作之后有一个序列点。
这些操作都发生在引用“实际调用之前有一个序列点”所描述的序列点之后。对参数和后缀表达式求值;然后输入函数;然后按顺序执行由格式字符串指定的操作。
例如,与%i相关联的操作是输出参数的值你似乎混淆了“输出参数”和“评估参数”;后者在函数输入之前发生。

关于c - 每个与输入/输出格式说明符关联的转换是否都是C中的序列点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51130081/

10-11 07:32