簡體   English   中英

以下代碼如何將輸出顯示為-99?

[英]How is the following code giving the output as -99?

下面給出的是一個初始化為“ face”的str的C代碼片段:

char *str = "face";
printf("%d\n", -2[str]);

首先,我們需要解析所討論的表達式: -2[str]有兩個運算符-下標運算符[]和一元負運算符- 下標運算符的優先級高於一元減號,因此printf打印否定2[str] *。

有很多問題和答案解釋2[str]str[2]相同,因此我不再重復解釋。 您可以在本問答中閱讀有關內容。

最后, str[2]值為'c' ,它表示系統上的代碼99 將負值應用於該值,這樣便可以打印-99

*注意-不是整數常量的一部分,因為在C中,整數常量不包括sign

問題中的代碼是:

char *str = "face";
printf("%d\n", -2[str]);

讓我們清楚一點:這很可怕,任何編寫該代碼的人都應該重寫它。

解決此問題時,有兩部分混淆:

  1. 為什么a[i] == i[a]
  2. 如何評估-2[str]

鏈接的問題廣泛涵蓋(1)。 閱讀。

要解決第二部分,請考慮一個替代程序:

#include <stdio.h>

int main(void)
{
    char data[] = "XYZface";
    char *str = &data[3];
    printf("[%s] %d %d %d (%c)\n", str, -2[str], -(2[str]), (-2)[str], (-2)[str]);

    return 0;
}

輸出:

[face] -99 -99 89 (Y)

為什么? -2[str]表示法與-str[2]等效(您已經閱讀了鏈接的問答,對嗎?)而不是str[-2] ,因為沒有負的文字數字。

閱讀C11§6.4.4.1整數常量 :其中沒有減號。 當您編寫-2 ,您有一元減號運算符和文字2 通常,這與負二相同,但與高優先級運算符(例如,下標)混合使用時則不同。 §6.5.2后綴運算符 (如下標)比§6.5.3一元運算符(反)具有更高的優先級。

讓我們也清楚一點:問題代碼中沒有未定義的行為(或者我相信我的)。 從技術上講,字母'c'+99 99)的值是實現定義的,但是現存的系統中'c'的整數值不是99的系統很少(有關答案可能有所不同的代碼集,請參見EBCDIC ) 。

讓我們剖析:

-2[str]

-(2[str])

由於運算符的優先級。 注意-2不是直接的整數文字; 2是並且它可以接收一元運算符- ,但是在此之前,將應用[]運算符。
下一步是

-(str[2])

因為(眾所周知的奇怪事實) a[i]==i[a]

-('c')

由於格式字符串%d ,它被視為一個負int ,其ASCII值的絕對值為'c'

-(99)
-99

(這當然是一些評論者的專有技術匯編:Jonathan Leffler,StoryTeller和我自己編寫的一小部分。)

如注釋中所述,代碼的工作方式如下:

-(2[str]) => -(*(2 + str)) => -str[2]

由於str[2]'c' ,其ASCII值為99 因此輸出為-99

謝謝講故事的人將其清除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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