2014-06-25 27 views
0

我最近遇到下面的代碼來使用語法CHAR()我以前從未見過:C/C++:用作功能

std::cout << char('A'+i); 

代碼的行爲是相當明顯的:它僅僅是打印一個字符轉換爲stdout,其值由ASCII表中'A'的位置加上計數器i的值(unsigned int類型)。

例如,如果i = 5,則上面的行將打印字符'F'。

我從來沒有見過字符用作函數之前。我的問題是:

  1. 此功能特定於C++還是它已經存在嚴格的C?
  2. 是否有使用char()作爲函數的技術名稱?

回答

1

這不是一個函數調用,而是一個類型轉換。更通常它寫作爲

std::cout << (char)('A'+i); 

這使得它清楚它不是一個函數調用,但您的版本也是如此。請注意,您的版本只能在C++中有效,而上面的版本可以在C和C++中使用。在C++中,你也可以更加明確地寫出

std::cout << static_cast<char>('A'+i); 

改爲。 不是因爲'A'+i將具有類型int而必須打印爲整數。如果你想把它解釋爲一個字符代碼,你需要使用char

+0

K&R的「The C programming language」堅持只能通過'(type)value'執行強制轉換,並且不會描述「type(value)'語法在所有。因此,我認爲這是一個C++擴展。 – tucuxi

+0

@tucuxi,你可能是正確的,編輯反映。 – toth

2

這是C++轉換語法。以下是等價的:

std::cout << (char)('A' + i); // C-style cast: (T)e 
std::cout << char('A' + i); // C++ function-style cast: T(e); also, static_cast<T>(e) 

Stroustroup的的C++編程語言(第3版,第131頁。)調用第一類C樣式轉換,第二型函數樣式轉換。在C++中,它相當於static_cast<T>(e)表示法。功能風格的轉換在C中是不可用的。

+0

感謝您的解釋。我的下一個問題就是擁有多種類型演員的目的是什麼。看起來我還有更多的研究要做。這裏是一個相關的問題/答案我將開始閱讀:http://stackoverflow.com/questions/4474933/what-exactly-is-or-was-the-purpose-of-c-function-style-casts – user2150989

+0

Stroustroup先生(C++的創造者)不喜歡C風格的演員 - 它肯定是危險的,因爲它的效果很大程度上取決於它轉換的內容;也就是說,從簡單的檢查中,很難知道將要發生的確切轉換。所以他添加了幾個函數樣式的變體,包括[這個問題]中的所有類型(http://stackoverflow.com/questions/332030) – tucuxi