在一次测试考试中,我们被告知要找出一些表达式的值。
除了 1 之外,其他都清楚,即"20"[1]
. 我以为这是数字的第一个索引,所以0
,但是用它打印的计算机进行测试48
。
这个“功能”到底是做什么的?
在一次测试考试中,我们被告知要找出一些表达式的值。
除了 1 之外,其他都清楚,即"20"[1]
. 我以为这是数字的第一个索引,所以0
,但是用它打印的计算机进行测试48
。
这个“功能”到底是做什么的?
它不是一个函数,它只是索引一个数组。
"20"
这是一个字符数组,我们正在获取索引 1 处的值 - 即'0'
- character '0'
。
这与
char chArr[] = "20"; // using a variable to hold the array
printf ("%d", chArr[1]); // use indexing on the variable, decimal value 48
printf ("%c", chArr[1]); // same as above, will print character representation, 0
根据ASCII 编码,十进制值'0'
是近来最常见的编码。48
好吧,根据您的观点,它是'0'
48 或 0x30。
#include <stdio.h>
int main()
{
printf("'%c' %d 0x%X\n", "20"[1], "20"[1], "20"[1]);
return 0;
}
以上印刷品
'0' 48 0x30
在这个下标表达式中
"20"[1]
"20" 是一个类型为 的字符串文字char[3]
。在表达式中使用的文字被转换为指向其第一个元素的指针。
所以这个表达式
"20"[1]
产生字符串文字的第二个元素,即'0'
.
你可以想象这张唱片像
char *p = "20";
char c = p[1];
48
是字符的 ASCII 值'0'
。
更奇特的记录可能看起来像
1["20"]
相当于之前的记录。
来自 C 标准(6.5.2.1 数组下标)
2 后缀表达式后跟方括号 [] 中的表达式是数组对象元素的下标指定。下标运算符 [] 的定义是 E1[E2] 等同于 (*((E1)+(E2)))。由于适用于二元 + 运算符的转换规则,如果 E1 是数组对象(等效地,指向数组对象的初始元素的指针)并且 E2 是整数,则 E1[E2] 指定第 E2 个元素E1(从零开始计数)。
这是一个演示程序
#include <stdio.h>
int main(void)
{
printf( "\"20\"[1] == '%c' and its ASCII value is %d\n", "20"[1], "20"[1] );
printf( "1[\"20\"] == '%c' and its ASCII value is %d\n", 1["20"], 1["20"] );
return 0;
}
它的输出是
"20"[1] == '0' and its ASCII value is 48
1["20"] == '0' and its ASCII value is 48