标题说明了一切。 我正在使用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
答案 0 :(得分:8)
重要的细节是您正在使用Windows,并且可能是过时的或不符合要求的C环境(编译器和标准库)。 MSVCRT只支持C89(即便如此,也不完全正确);特别是,C89中没有“hh”修饰符,它可能将“hh”解释为“h”(即short
)。