2017-04-04 100 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;否则,你将分配指针值(即一些内存地址)。