[英]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]);
讓我們清楚一點:這很可怕,任何編寫該代碼的人都應該重寫它。
解決此問題時,有兩部分混淆:
a[i] == i[a]
? -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.