2012-08-25 36 views
18
char* a="dsa" "qwe"; 
printf("%s",a); 

輸出:dsaqwe兩個字符串文字串聯如何工作?

我的問題是,爲什麼做這件事的工作。如果我在兩個字符串文字之間給出空格或空格,它會連接字符串文字。

這是如何工作的?

+0

請在題目中加上真實的東西。我爲你編輯了這個,請看看它是否合適。 –

回答

23

它由ISO C標準定義,相鄰的字符串文字被合併爲一個。

的語言是有點乾燥(它畢竟是一個標準的),但部分C11的6.4.5 String literals規定:

在翻譯階段6中,由 相鄰字符和相同的任何序列中指定的多字節字符序列 - 前綴寬字符串文字標記連接成單個多字節字符序列的 。

這也在5.1.1.2 Translation phases, point 6提到,多了幾分簡潔:

相鄰字符串文字令牌是連接在一起。

這基本上意味着"abc" "def""abcdef"沒有什麼不同。

它通常用於製作同時還具有很好的格式化長字符串有用:

char *myString = "This is a really long " 
       "string and I don't want " 
       "to make my lines in the " 
       "editor too long, because " 
       "I'm basically anal retentive :-)"; 
+0

作爲細節的標尺沒什麼問題。 –

6

你回答了你自己的問題。

如果我在兩個字符串文字之間給出空格或空格,它會連接字符串文字。

這是C語法的特徵之一。

-4

我很確定這是一個編譯器功能。

+2

不是編譯器功能,它是ISO標準。 –

+0

...正因如此,它是在編譯器中構建的。所以它是一個編譯器功能。 –

+0

請參閱接受的答案。不要誤導任何人。您應該閱讀一些關於編譯器的內容並檢查您的術語。 –

1

ISO C標準§5.1.1.2說: -

  1. 相鄰字符串文字令牌是連接在一起。
  2. 分隔標記的白色空格字符不再重要。
+0

實際上,第二個階段有一個階段7活動,在第六階段的相鄰字符串文字合併之後完成。在這個意義上相鄰的意思是無論如何都忽略空白區域。但是,第一個爲+1。 – paxdiablo

3

並回答您未經提出的問題,「這有什麼好處?」

首先,您可以將常量放在字符串文字中。您可以編寫

#define FIRST "John" 
#define LAST "Doe" 

const char* name = FIRST " " LAST; 
const char* salutation = "Dear " FIRST ","; 

然後如果您以後需要更改名稱,則只需在一個位置更改名稱即可。
這樣的事情。