代码之家  ›  专栏  ›  技术社区  ›  chqrlie

可以为scanf(“%x”,…)传递int的地址吗?

  •  2
  • chqrlie  · 技术社区  · 6 年前

    以下代码是否定义了beavior:

    #include <stdio.h>
    
    int main() {
        int x;
        if (scanf("%x", &x) == 1) {
            printf("decimal: %d\n", x);
        }
        return 0;
    }
    

    -pedantic

    fscanf 功能

    ...

    ...

    转换说明符及其含义如下:

    ...

    x 匹配一个可选的有符号十六进制整数,其格式与 strtoul 16 对于 base 争论。相应的参数应该是指向无符号整数的指针。

    论二者的互补结构 -1 具有 %x

    是否有任何规定来定义此行为或至少定义实现?

    1 回复  |  直到 4 年前
        1
  •  1
  •   supercat    6 年前

    这属于高质量实现应该支持的行为类别,除非它们记录了这样做的充分理由,但标准没有强制要求这样做。标准的作者似乎没有试图列出所有这些行为,至少有三个很好的理由:

    1. 这样做会使标准变得更长,而花墨汁描述读者无论如何都会期望的明显行为会分散读者对标准需要引起读者注意的地方的注意力。

    2. 标准的作者可能不想排除这样一种可能性,即一个实现可能有充分的理由去做一些不寻常的事情。我不知道这是否是你的特殊情况下的考虑,但它可能是。

      int* 传递给 %X 争论。该标准的作者几乎肯定没有意识到任何这样的环境[我怀疑是否存在任何这样的环境],因此无法权衡使用环境的scanf例程的好处与支持常见行为的好处。因此,将这种判断权留给那些能够更好地评估每种方法的成本和收益的人是有意义的。

    在实践中,一些编译器编写人员似乎将标准未能强制执行某些操作的大多数情况视为一种邀请,即假定代码永远不会尝试它,即使标准之前的所有实现都表现出一致的行为,也不太可能有任何好的理由让一个实现做其他的事情。因此,使用 读一本书 int