数组类型 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 答案:数组 name 是 not 可修改的左值。因此,您不能对其使用赋值运算符 (=
)。
将内容复制到数组中,一般需要使用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, [....]
因此,数组名称不是可修改的左值,因此,您不能向它分配任何内容。这就是错误消息背后的原因。
不能使用=
运算符将一个数组的内容复制到另一个;您必须对字符串使用 strcpy
或 strcat
之类的库函数,对非字符串使用 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) 无法分配无论如何。
这是我的第一个 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 答案:数组 name 是 not 可修改的左值。因此,您不能对其使用赋值运算符 (=
)。
将内容复制到数组中,一般需要使用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, [....]
因此,数组名称不是可修改的左值,因此,您不能向它分配任何内容。这就是错误消息背后的原因。
不能使用=
运算符将一个数组的内容复制到另一个;您必须对字符串使用 strcpy
或 strcat
之类的库函数,对非字符串使用 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) 无法分配无论如何。