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 に答える