数组类型 char[] 不可赋值

Array type char[] is not assignable

这是我的第一个 post。我一直在尝试做这个选择选择的事情,我希望用户只选择数字而不是输入它们(更容易)但是当我希望数字等于一个字符串时,它说 "array type char[30] is not assignable"。即使在后面我是否加了分号。

#include <stdio.h>

int main() {
  int choice1;
  char word[30];

  printf("You have three choice.\n");
  printf("[1] Jump [2] Run [3] Dance\n");
  scanf("%d",&choice1);
  if (choice1 == 1)
  {
    word = "Jump" //Error #1
  }
  else if (choice1 == 2)
  {
    word = "Eat" //Error #2
  }
  else if (choice1 == 3)
  {
    word = "Sleep"; //Error #3
  }

  printf("You will now be %sing",word);

}

你不能赋值给一个数组,只能复制给它。

改用strcpy,比如

strcpy(word, "Jump");

使用 strcpy<string.h>-

 strcpy(word,"Jump");

其余类似。

你就是做不到 word ="Jump"。由于内容是可修改的,数组本身是不可修改的。

TL;DR 答案:数组 namenot 可修改的左值。因此,您不能对其使用赋值运算符 (=)。

将内容复制到数组中,一般需要使用strcpy() from string.h (char array) or memcpy()


现在,详细说明错误消息背后的实际原因,引用C11,章节§6.5.16,Assignment operators

assignment operator shall have a modifiable lvalue as its left operand.

然后,引用同一标准的第 6.3.2.1 章,

A modifiable lvalue is an lvalue that does not have array type, [....]

因此,数组名称不是可修改的左值,因此,您不能向它分配任何内容。这就是错误消息背后的原因。

不能使用=运算符将一个数组的内容复制到另一个;您必须对字符串使用 strcpystrcat 之类的库函数,对非字符串使用 memcpy (或单独分配数组元素)。

这是 C 处理数组 表达式 的结果。数组表达式被语言标准定义为不可修改的左值;它是一个左值,因为它指的是内存中的一个对象,但它可能不是赋值的目标。

数组下标运算a[i]定义为*(a + i);也就是说,给定数组 address a,从该地址偏移 i 元素并取消引用结果。由于数组表达式 a 被视为指针,因此大多数人认为 a 变量 存储 指向数组第一个元素的指针,但它不是.所有被存储的都是数组元素本身。

相反,每当编译器在语句中看到数组表达式时,它 将该表达式从类型 "N-element array of T" 转换 为 "pointer to T",并将表达式成为数组第一个元素的地址(除非表达式是 sizeof 或一元 & 运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字) .

这就是为什么像 word 这样的数组表达式不能作为赋值的目标;没有任何东西可以分配给 。没有对象 word 独立于 word[0]word[1]

写的时候

word = "Jump";

表达式"Jump"的类型由“char的5元数组”转换为"pointer to char",表达式的值为第一个元素的地址的阵列。并且您正在尝试将 pointer 值分配给 array 对象,其中 a) 不是指针,b) 无法分配无论如何。