3

MSVC2013RC は、以前のバージョンの MSVC よりも c 標準をより適切に処理すると聞いたので、MSVC2013RC をダウンロードしました。だから私はそれをダウンロードして、Windowsプラットフォームで本当に探していたものをいくつかテストしました.

しかし、すでに最初のテストでかなりがっかりしました。

#include <stdlib.h>
#include <stdbool.h>
#include <stdio.h>

int testFunction(int iIn);


int main(int argc, char** argv)
{
    int *TheKiddingBool;

    TheKiddingBool= NULL;

    TheKiddingBool= malloc(sizeof (int));

    *TheKiddingBool= 17;

    _Bool bWow;

    bWow = true;

    if (testFunction(*TheKiddingBool) == bWow)
    {
        printf("\r\nQAtest succesed!\r\n");
    }

    return 0;
}

int testFunction(int iIn)
{
    return iIn;
}

の比較testFunction(*TheKiddingBool) == bWowは false を返します。これは、MSVC13 の C コンパイラのかなり難しいバグですか?

それとも私はその線を理解しているだけですか

6.3.1.2 ブール型

§1 スカラー値が _Bool に変換されるとき、値が 0 と等しい場合、結果は 0 です。それ以外の場合、結果は 1 です。

c99 ISO/IEC 9899:TC3 はかなり間違っていますか?

4

3 に答える 3

2

msamが私に指摘したように

6.3.1.1 — _Bool のランクは、他のすべての標準整数型のランクよりも小さくなければなりません。

そして、この「ランキング」が何を意味するのかを調べたところ、これはバグではなく、間違った戻り値の型を使用しただけであることがわかりました。標準では、_Bool のランキングが最も低くなければならないと言われています。

(ここでも、助けてくれてありがとう)

于 2013-09-16T12:46:52.757 に答える
1

6.3.1.1 — _Bool のランクは、他のすべての標準整数型のランクよりも低くなければなりません。

これは_Bool、算術比較が実行されるときに暗黙的にそれぞれの整数型に変換されることを意味します。

を考慮した上でご注意ください。

6.3 オペランド値を互換性のある型に変換しても、値または表現は変更されません。

6.2.5 _Bool 型として宣言されたオブジェクトは、値 0 と 1 を格納するのに十分な大きさです。

_Bool8 ビット以上の整数を潜在的に 1 ビットで表現される bool に変換すると、切り捨てが発生し、値/表現が変化するため、他の整数よりもランクが低くなければなりません。

于 2013-09-16T13:17:47.410 に答える