2013-09-16 31 views
3

我剛剛下載了MSVC2013RC,因爲我聽說它將會更好地處理c標準,而MSVC以前的版本則更好。所以我剛下載並測試了一些我在Windows平臺上真正需要的東西。MSVC13RC仍然不尊重C標準?

但已經第一次測試讓我非常失望。

#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相當錯?

+3

比較當帶'_Bool'的int,是將int轉換爲_Bool還是將_Bool轉換爲int? –

+0

嗯有趣的問題,但不應該一個聰明的編譯器注意到,如果我用'_Bool'將comapre'int'轉換爲'_Bool',那麼將int轉換爲無意義? – dhein

+4

6.3.1.1 - _Bool的排名應小於所有其他標準整數類型的排名。 – msam

回答

1

6.3.1.1 - _Bool的排名應小於所有其他標準整數類型的排名。

這意味着_Bool將執行算術比較時隱式轉換爲相應的整數類型。

注意,考慮到

6.3轉換操作數的值向兼容的類型會導致不改變值或 表示。

6.2.5一個目的聲明爲類型_Bool是大到足以存儲值0和1。

_Bool必須具有比其他整數秩下,由於8+位整數轉換成一個潛在的1位表示布爾將達到截斷,而在值/表示的變化

2

好視MSAM向我指出

6.3.1.1 - _Bool的等級應低於所有其他標準整數類型的級別。

我查了一下這個「排名」是什麼意思,我發現這不是一個bug,我只是使用了錯誤的返回類型,因爲標準說_Bool必須具有最低的排名。

(這裏再次爲幫助謝謝)

3

根據7.18.3

真正

其擴展爲整型常量1

使你比較爲if (17 == 1)它返回false

+0

你是對的,但我很困惑的一點是,爲什麼很明顯,真實將被轉換爲1而不是17?真正的?)....現在我知道它了。但在此之前,這是瓶頸。 – dhein

+0

@Zaibis因爲17是int而true是_Bool。 AFAIK –

+0

是的,這是真的,但爲什麼會發生這種情況的原因是標準給布爾所有itneger類型的最小排名,並且標準說如果2個不適合的integere類型被操作,那麼具有較少rankign的那個被轉換爲一個排名更高(這是我以前不知道的) – dhein