2017-04-04 102 views
-4
void* PrintHello(void *threadid) 
{ 
     long tid; 
     tid =(long)threadid; 
     printf("Hello World! It's me, thread #%ld!\n",tid); 
     pthread_exit(NULL); 
} 

我想知道變量聲明的每個元素代表什麼,如果有更簡單的方法(更可讀/類似),只是printf?printf的#%ld! n的每個元素是什麼意思?

#=

%=

LD =長整型

! =不是?

\ n =新行

此外,指針似乎對我們的幻燈片兩種不同的方式來寫。

有:

void* function_name(void* args) 

而且有:

void* function_name(void *args) 

什麼是星號位置的意義是什麼?在這個例子中看起來是正確的?

+1

除了你列出的那個,他們只是字符。 – Ssswift

+1

@戴:不正確。存在'%'('%ld')。 –

+0

'%ld'指的是'tid'變量,'#'和'!'只是常規字符。 –

回答

1

也許你也會有興趣看到類似的C++語句?

另外,對於你們中的一些人來說,C++版本將解釋什麼是printf格式信息。


  • 的std ::默認的printf輸出定向到標準輸出。 C++使用std :: cout

  • '#'和'!'只是字符(兩種形式)

所以,在C++:

std::cout << '#' << tid << "!\n"; 

不過,我可能會使用:

std::cout << '#' << tid << '!' << std::endl; 

注:

  • 您是否注意到沒有%ld?編譯器已經知道了tid的類型(即long int),所以你不需要像std :: printf那樣第二次向std :: cout解釋它。

  • 另一個好處是,當某人將tid類型更改爲int32_t(或者可能是int64_t或static_cast更小)時,cout行不受影響。很快,對於「long long unsigned int」,%XXd的XX是什麼?我們怎麼樣再也不看那個。


什麼是星號位置的意義是什麼?在這個例子中看起來應該是 ?

兩種表格都是'正確的'。我更喜歡'*'形式,可能是因爲我的背景(幾乎沒有'c'曝光)。

2

閱讀printf()的編譯器文檔。或者在線文檔,如this onethis one。文檔將向您詳細解釋各種參數和佔位符的含義。

在你的例子中,#!並不意味着什麼。它們不在任何格式說明符中,所以它們只是文字字符數據,就像大部分格式字符串內容一樣。只有在%之前的說明符纔有特殊含義。

%字符是一個轉義字符,它告訴printf()處理以下ld說明符。 printf()將用格式化字符串中的tid變量的值替換%ld

4

當打印含有變量的東西時,需要%來聲明這是var輸入的位置。 #只是一個普通的字符。 ld只是表示您輸入的var的類型。在這種情況下,long!意味着什麼,它只是一個普通的字符。此外,在打印var時,唯一重要的事情(在這種情況下)是%ld之間的變量類型。如前所述,\n只意味着新行。

星號位置不會改變任何東西。他們都是正確的。星號的原因只是告訴你這是一個指針

0

這不是C語言的特定關鍵字。 讓我解釋一下。

#%ld!\n 

等於

# : Hash character to show count/numbers 
%ld : Specifier referencing a long integer that you want to show. 
! : Simple exclamatory character. 
\n : New line 
0

正如其他人已經陳述的,在%ld格式字符串"Hello World! It's me, thread #%ld!\n"定義了long類型的變量將被放置的地方。 #!是普通字符,而\n代表一個新行(特殊字符反斜槓給後續字符一個特殊含義)。

但是,當您將long tid =(long)threadid指定爲threadid類型爲void*時,代碼中存在另一個問題,即指向某種非特定類型的指針。實際上,如果你知道threadid會指向一個很長的時間,你應該寫long tid = *((long*)threadid)來解引用指針並把它解釋爲特定類型long;否則,你將分配指針值(即一些內存地址)。