[英]I need to know how the output was generated by this source code
#include <stdio.h>
int main()
{
char c[]="GATE2016";
char *p = c;
printf("%s",p+ p[3] - p[1]);
}
上面源代碼的輸出是
2016
我沒有絲毫線索。 當我編輯時
char c[]="asdf2016"
顯示的輸出是
`
有人可以幫我嗎?
首先, p
是指向數組c
的第一個元素的指針,因此,每當單獨傳遞p
時,其行為都將與傳遞c
完全相同,也就是說,它將從p
的地址讀取直到達到字符串終止符'\\0'
。
現在,有人說這取決於您的代碼使用ASCII還是EBCDIC或任何其他編碼。 沒錯,但是您的代碼並不立即依賴於此。 重要的是,在您的字符串"GATE2016"
的情況下,字符'A'
和'E'
(在printf調用"GATE2016"
這種看起來古怪的代碼訪問的字符)是一個接一個的,並且從中減去A E給出4,您將明白為什么。 為了這個示例,我將使用ASCII。
在ASCII中,字符'A'
等於65,而'E'
等於69。
printf("%s",p+ p[3] - p[1]);
您實際在做什么可以翻譯成
printf("%s",p+ 'E' - 'A');
或簡單地
printf("%s",p+ 69 - 65);
可以進一步簡化為
printf("%s",p + 4);
現在,由於printf的"%s"
格式需要一個指向字符串開頭的指針,因此在這種情況下,您實際上作為參數傳遞的是p
+ 4的地址(由於它是指針,因此會移位4個內存插槽),因此您將位置[4]作為字符串的開頭( p + 4 == &p[4]
),printf開始在位置4讀取字符串,其中包含2016年的2。讀取直到它在您的字符串中達到'\\0'
並只打印出2016年,這也解釋了為什么它不適用於"asdf"
。
請記住,C中的字符只是數字,而在ASCII中,寫'A'
與寫數字65
完全相同。
好,
首先,變量p和c是地址。 其次,字符在內部仍表示為數字。 我假設在您的實現中,ASCII代碼決定了這種表示形式,因此在ASCII中:
'E'= 69和'A'= 65,有關更多信息,請參見ascii代碼
p[3] = 'E'
p[1] = 'A'
在您的字符串中,以便printf實際上從p + 4打印,即從p [4]開始打印到最后。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.