![](/img/trans.png)
[英]Why printing -1 for this code, I supposed it to be 1 when bit-field is set to 1?
[英]Please, why is this code printing with an extra “n” when I run it?
我正在嘗試使用此代碼獲取 pid。 但是當我運行編譯的代碼時。 我收到一條錯誤消息“警告:格式指定類型'unsigned long',但參數的類型為'pid_t'(又名'int')[-Wformat]”。
當我將格式說明符更改為“%lu”時,它不會打印額外的字符。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid = getpid();
printf("pid: %lun", pid);
}
我預計 pid 為“60316”。 我得到“60316n”的pid。
n
打印出來的原因與p
打印的原因相同。 n
不是說明符的一部分。
vvv --- specifier for unsigned long
"pid: %lun"
^^^^^ ^ --- non-specifier characters
在旁邊:
pid_t
數據類型是帶符號的 integer類型,能夠表示進程 ID
您傳遞給printf
的格式字符串是普通字符和格式說明符的混合體。 普通字符本身打印,格式說明符導致額外的 arguments 之一被轉換和打印。 但是每個額外參數的類型必須與格式說明符所期望的類型或多或少完全匹配。
我們可以從警告消息中看出pid
是一個int
。 所以正確的格式說明符是%d
。
如果pid
的類型為unsigned long int
,則說明符%lu
將是正確的。
格式說明符是它們自己的小型編程語言。 unsigned int
類型的基本格式說明符是%u
,您可以修改它以打印unsigned long int
,而不是使用l
(字母 ell )修飾符: %lu
。
但是當你寫%lun
時, n
實際上並不是任何格式說明符的一部分,所以它本身就打印出來了。
(另外,你很幸運:盡管pid
的類型和格式說明符%lu
不匹配,你還是得到了一個合理的值。)
通常,讓 arguments 和格式說明符排列起來很容易: int
代表%d
, unsigned int
代表%u
或%x
, long int
代表%ld
, float
或double
代表%f
等等。但是什么是正確的說明符用於具有pid_t
類型的pid
? 今天,在您的計算機上,它看起來pid_t
是一個int
,所以%d
是正確的,但是如果在其他計算機上它具有不同的類型怎么辦? 你如何編寫一段代碼,在任何計算機上都能正常工作? 一種方法是選擇一個可能正確的類型,並使用該類型的說明符,然后使用顯式轉換將您的值轉換為您選擇的類型。 像這樣:
printf("pid: %d\n", (int)pid);
或者像這樣:
printf("pid: %lu\n", (unsigned long int)pid);
如果不需要強制轉換(如果您選擇的格式說明符對於您計算機上的pid
類型已經正確),則強制轉換不會受到傷害。
最后,恭喜您使用了實際上給您警告消息的編譯器:
警告:格式指定類型“無符號長”,但參數的類型為“pid_t”(又名“int”)
太多的初級程序員被困在使用不打印此類警告的舊編譯器,這顯然使得追蹤由不匹配的格式說明符引起的問題變得更加困難! (您的編譯器特別有用,因為它為您提供了pid
的明顯類型,即pid_t
,以及實際的底層類型int
。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.