簡體   English   中英

我需要知道此源代碼如何生成輸出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM