3

我刚刚下载了 MSVC2013RC,因为我听说它会比以前的 MSVC 版本更好地处理 c 标准。所以我只是下载了它并测试了一些我在 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

3

根据 7.18.3

真的

展开为整数常量 1

将您的比较作为 if (17 == 1)which 返回false

于 2013-09-16T12:54:41.600 回答
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。

_Bool必须比其他整数具有更低的等级,因为将 8+ 位整数转换为潜在的 1 位表示的布尔值将相当于截断,并且值/表示的变化

于 2013-09-16T13:17:47.410 回答