2012-02-22 29 views
2

考慮以下情況:不確定-Wconversion行爲

 char const a = (i == 0) ? 0 : copy[i - 1][j]; 

 char const a = (i == 0) ? '\0' : copy[i - 1][j]; 

爲什麼第一個例子產生如下:warning: conversion to ‘char’ from ‘int’ may alter its value [-Wconversion],然而第二個沒有。

FWIW,copychar**

這種行爲並不侷限於char,同樣可以看到其他整數大小,所以它看起來是推廣的問題。

+0

需要注意的是,當我== 0的副本中的值[-1] [J]被分配給一個可能不是你想要的。 – 2012-02-22 03:28:47

+0

@LanceRichardson你是對的,我的意思是說(我= 0)不是(我!= 0)。 – dcousens 2012-02-22 04:02:22

回答

3

當一個結果參數?:0(一個int),其他結果參數被提升到相同類型— C++要求兩個可能的結果具有相同的類型。處理升級之後,編譯器會丟棄有關原始類型的信息,因此在發出警告時,編譯器不再知道它一直警告的內容是否爲char。它不會抱怨,因爲它知道字面0是一個有效的char值的第二個參數被降級到char

+0

如果這是問題,它將0提升爲int(因此也是第三個參數),爲什麼'char const a =(i == 0)? 0:127;'不產生這個警告。 – dcousens 2012-02-22 03:58:26

+0

它不會將'0'提升爲int。該值*已經有*該類型。註釋中的兩個值都適合'char',它們是*文字*,所以無論它們的類型如何,編譯器都知道它們將適合'char'。將其中一個存儲在'int'變量中,您應該再次看到該警告。 – 2012-02-22 05:07:22

+0

所以簡單地說,它將我的第三個參數'char'提升爲'int',因此給了我這個警告。儘管事實上它的第二個參數是一個容易適合'char'的文字,因此可以是'char'類型;因此不會將我的第三個參數提升爲'int';引起警告。 當然。這很煩人,但很好。 – dcousens 2012-02-22 05:51:04

1

不同的是,「\ 0」的類型是字符,而0的類型是int。

類型三元運算的結果,當第二和第三個表達式具有不同的算術類型,是由提升到使用用於在算術表達式的類型相同的規則的公共運算式而獲得。當其中一個表達式的類型爲「int」,另一個表達式的類型爲「char」時,結果的類型爲「int」。編譯器正在抱怨一個「int」值被分配給一個char變量。

更智能的編譯器可能會跟蹤結果的值的可能範圍(在這種情況下,它與「char」的可能值的範圍相同),並且推斷實際上不存在從「int」到「char」的轉換將產生一個值的變化。

+0

看到我的最新編輯,它顯示問題不是0 ...但數組是char **類型的,所以它不在那裏呢? – dcousens 2012-02-22 03:13:19

+0

int可以保存char或short的每個值,但反過來並不正確,這就是爲什麼在將較大類型分配給較小類型時只會得到警告的原因。 – 2012-02-22 03:17:32

+0

已更新,擴大一點點... – 2012-02-22 03:19:07