2

在一次测试考试中,我们被告知要找出一些表达式的值。

除了 1 之外,其他都清楚,即"20"[1]. 我以为这是数字的第一个索引,所以0,但是用它打印的计算机进行测试48

这个“功能”到底是做什么的?

4

3 回答 3

7

它不是一个函数,它只是索引一个数组。

"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

于 2019-12-04T14:02:14.627 回答
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
于 2019-12-04T14:08:51.950 回答
1

在这个下标表达式中

"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
于 2019-12-04T14:13:56.507 回答