在一次考试中,我们被告知要查找某些表达式的值。
除1之外的所有其他字符都清晰可见,即"20"[1]
。我以为它是数字的第一个索引,所以0
,但是在计算机上测试时它会显示48
。
该“功能”的确切作用是什么?
答案 0 :(得分:7)
这不是函数,只是索引数组。
"20"
是一个字符数组,我们从索引1取值-'0'
-字符'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 encoding,'0'
的十进制值为48
,这是最近几天最常见的编码。
答案 1 :(得分:3)
好吧,根据您的观点,它可以是'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
答案 2 :(得分:1)
在此下标表达式中
"20"[1]
“ 20”是类型为char[3]
的字符串文字。用于表达式中的文字将转换为指向其第一个元素的指针。
所以这个表情
"20"[1]
产生字符串文字的第二个元素'0'
。
您可以想象这样的记录
char *p = "20";
char c = p[1];
48
是字符'0'
的ASCII值。
更奇特的记录可能看起来像
1["20"]
等同于上一条记录。
根据C标准(6.5.2.1数组下标)
2后缀表达式,后跟方括号[] 是数组对象元素的下标名称。的 下标运算符[]的定义是E1 [E2]等于 (*((E1)+(E2)))。由于适用于 二进制+运算符,如果E1是数组对象(相当于一个指针) 到数组对象的初始元素),并且E2是整数, E1 [E2]表示E1的第E2个元素(从零开始计数)。
这是一个演示程序
#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