【发布时间】:2016-03-01 00:11:47
【问题描述】:
下面的代码定义好了吗?
#include <stdio.h>
int ScanFirstOrSecond(const char *s, int *dest) {
return sscanf(s, "%d%d", dest, dest);
}
int main(void) {
int x = 4;
ScanFirstOrSecond("5", &x);
printf("%d\n", x); // prints 5
// Here is the tricky bit
ScanFirstOrSecond("6 7", &x);
printf("%d\n", x); // prints 7
return 0;
}
换句话说,... 参数对它们有隐含的restrict 吗?
我发现的最适用的 C 规范是
fscanf 函数依次执行该格式的每个指令。 ... C11dr §7.21.6.2 4
【问题讨论】:
-
与限制无关。它的定义很好。您将两次写入同一地址的值,以便获得最新的值。
-
几个月前,我在处理
scanf的 UB 检测实现时遇到了同样的问题。 -
@Pascal Cuoq 如果是骗子,请告知。我确实找了 15 分钟,但如果是的话也不会感到惊讶。
-
@nneonneo 你确定你了解
restrict的工作原理吗?在 C11 6.7.3.1:4 中查找“and X is also modified”。 -
考虑使用
scanf的等效情况。如果你用newline分隔这两个条目,你会期望它们被颠倒吗?
标签: c language-lawyer restrict