6

标题说明了一切。我正在使用 GCC 4.7.1(与 CodeBlocks 捆绑)并且遇到了一个奇怪的问题。考虑一下:

int main() {
    unsigned char a = 0, b = 0, c = 0;
    scanf("%hhu", &a);
    printf("a = %hhu, b = %hhu, c = %hhu\n", a, b, c);
    scanf("%hhu", &b);
    printf("a = %hhu, b = %hhu, c = %hhu\n", a, b, c);
    scanf("%hhu", &c);
    printf("a = %hhu, b = %hhu, c = %hhu\n", a, b, c);
    return 0;
}

对于输入 1、2 和 3,此输出

a = 1, b = 0, c = 0
a = 0, b = 2, c = 0
a = 0, b = 0, c = 3

但是,如果我将 a、b 和 c 声明为全局变量,它会按预期工作。为什么会这样?

先感谢您

其他详情:

我正在运行 Windows 8 64 位。我也尝试了 -std=c99 并且问题仍然存在。

进一步的研究

测试此代码

void printArray(unsigned char *a, int n) {
    while(n--)
        printf("%hhu ", *(a++));
    printf("\n");
}

int main() {
    unsigned char array[8];
    memset(array, 255, 8);
    printArray(array, 8);
    scanf("%hhu", array);
    printArray(array, 8);
    return 0;
}

表明 scanf 将“%hhu”解释为“%u”。它直接忽略了“hh”。输入为 1 的代码输出为:

255 255 255 255 255 255 255 255
1 0 0 0 255 255 255 255
4

1 回答 1

11

重要的细节是您使用的是 Windows,并且可能是过时或不符合标准的 C 环境(编译器和标准库)。MSVCRT 仅支持 C89(即便如此,也不完全正确);特别是,C89 中没有“hh”修饰符,它可能将“hh”解释为“h”(即short)。

于 2013-04-05T03:23:55.467 回答