簡體   English   中英

為什么C ++不為字符數組接受有符號或無符號字符

[英]Why doesn't C++ accept signed or unsigned char for arrays of characters

我在Visual Studio 2017中以純模式使用C ++。該編譯器編譯下面的語句而沒有抱怨:

const char * AnArrayOfStrings[]  = {"z1y2x3w4", "Aname"};

但是,如果我更改上述語句以指定char是有符號或無符號的,則編譯器會發出C2440錯誤。 例如,下面的語句編譯:

const signed   char * AnArrayOfStrings2[] = {"z1y2x3w4", "Aname"};

const unsigned char * AnArrayOfStrings2[] = {"z1y2x3w4", "Aname"};

我沒有看到編譯器在明確表示char的符號時拒絕編譯語句的原因。

我的問題是:有沒有一個很好的理由我沒有看到編譯器拒絕編譯這些語句?

感謝您的幫助(我在StackOverflow中進行了研究,C ++文檔,我使用了Google,並且為了自己找到答案而咨詢了大量的C / C ++書籍,但仍有一個原因讓我望而卻步。)

"z1y2x3w4"const char[9]並且沒有從const char*const signed char*隱式轉換。

你可以使用reinterpret_cast

const signed char * AnArrayOfStrings[]  = {reinterpret_cast<const signed char *>("z1y2x3w4"),
                                           reinterpret_cast<const signed char *>("Aname")};

如果您編譯上面的代碼

const signed   char * AnArrayOfStrings2[] = {"z1y2x3w4", "Aname"};  

在C中使用gcc選項-Wall然后它會發出以下警告

test.c:5:49: warning: pointer targets in initialization differ in signedness [-Wpointer-sign]
  const unsigned   char * AnArrayOfStrings2[] = {"z1y2x3w4", "Aname"};
                                                 ^
test.c:5:49: note: (near initialization for 'AnArrayOfStrings2[0]')
test.c:5:61: warning: pointer targets in initialization differ in signedness [-Wpointer-sign]
  const unsigned   char * AnArrayOfStrings2[] = {"z1y2x3w4", "Aname"};  

AnArrayOfStrings2"z1y2x3w4"的元素類型不同。 AnArrayOfStrings2[0]的類型為const signed char *"z1y2x3w4"的類型為const char[9]
相同的代碼會引發C ++中的錯誤。 您需要使用顯式強制轉換才能使其在C ++中工作。


解釋原因

const char * AnArrayOfStrings[]  = {"z1y2x3w4", "Aname"}; 

我會舉一個簡單的例子

const char c[] = "asc";
const char *p1 = c;           // OK
signed const char *p2 = c;    // Error
unsigned const char *p3 = c;  // Error

在上面代碼片段的第二行中, c將轉換為const char *從而使p1c兼容類型。
在第三行中, p2c的類型是不兼容的,編譯器將在C ++中引發錯誤(C中的警告)。 第4行也會發生同樣的情況。

如果我們采用另一個int類型的例子

const int i[] = {1,2,3};
const int *ii = i            // OK
signed const int *si = i;    // OK
unsigned const int *usi = i; // Error  

前兩個指針初始化作為int工作,沒有任何說明符等同於signed int (但這不適用於char ),因此類型是兼容的。 在最后一種情況下,初始化失敗,因為const int *signed const int *unsigned const int *不兼容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM