
正文
c语言数组显示没有左值,数组不是左值
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
C语言数组(array)可以是左值吗
1、数组一般不作为左值出现。因为数组和指针有着本质的差别。数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。
2、“left operand must be l-value”的意思是左操作数必须是左值。左值(l-value):出现于“=”左边的标识符。(为变量)。右值(r-value):出现于“=”右边的标识符。(变量或表达式)。表达式:产生确定不变的值。
3、数组名本质上就是个指针,也就是地址,但是它是一个常指针,是个固定值,而指针是是指针变量的简称,是个变量,这个变量存放的是地址值,它的值是可以改变的。
4、数组名本身是一个值,这个值是是一个写在符号表中的,并不是分配一个内存空间来存储这个值的,这也是为什么数组名不能作为左值的原因,而指针是需要分配一个内存4字节来存储这个值,因此它可以为左值。
5、在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。
相关问答
Q1: (c语言)a++的返回值不是左值,怎么解释???
c语言中函数返回值都是存储在临时变量里面的,而临时变量是不能作为左值的,即不能放在=左边,因而C语言函数返回值都是右值。假设函数Type fun(), 定义Type i,在c语言中语句 fun() = i; 总是错误的。
左值 ,就是指可以被取地址的表达式。简单的说,可以出现在等号左边的就是左值。比如:另外也可以有不是变量的左值:这里,getRef()返回的是一个全局变量的引用,它的值存在固定的位置,因此是一个左值。
按字面意思,通俗地说。以赋值符号 = 为界,= 左边的就是左值,= 右边就是右值。 比如:(1) int b = 3;(2) int a = b;第(2)行代码,a为左值,b为右值。
赋值表达式返回的就是左值,如果这样写:(a=3)++; 这句程序是正确的,可以通过编译。因为(a=3)是赋值表达式,返回左值,而++运算符正好作用于一个左值。第二题:B 。c++的意思是先返回c的值,然后再将c加1。
Q2: C语言问题
1、C语言中,函数的隐含存储类型是( )①auto ②static ③extern ④无存储类别 「解」由于C函数内不能再定义函数,C函数的存储类型只能是静态的或外部的之一。
2、{ int a=5;printf(%d,A);} 编译程序把a和A认为是两个不同的变量名,而显示出错信息。C认为大写字母和小写字母是两个不同的字符。习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。
3、“left operand must be l-value”的意思是左操作数必须是左值。左值(l-value):出现于“=”左边的标识符。(为变量)。右值(r-value):出现于“=”右边的标识符。(变量或表达式)。表达式:产生确定不变的值。
4、答案A:46是这样得到的:scanf 是输入语句,%2d%2d%3d,&a,&b,表示按照两位整数的格式依次获取两个输入的数据,并且分别存储在变量和变量b中,所以 a=12,b=34。
Q3: 为什么数组名不能为左值,不能赋值
当然是第二种,数组名就是数组的首地址。因为数组一旦定义就会被分配一片连续的空间,因此数组的首地址是不变的,因此可以说数组名是一个常量指针,一旦定义就不能再被赋值了。
数组名不能被放在赋值运算符的左边(它不是一个左值,更不是一个可修改的左值)。一个数组是一个对象,而它的数组名就是指向这个对象的第一个元素的指针。
数组名称 是一个指针,但是是一个常量。定义时被赋了初始值(数组的首地址)所以 s=s+1 是错误的。int *p是一个“指针变量”,它可以指向任何一个 int 型变量的地址(指针)。
不可以的,字符数组的数组名表示数组的首元素地址,即数组名本身实际上是一个地址值,即指针,但是这个地址值是个常量,不能对它进行赋值。所以,a=b;编译出错,同样的道理,b=a;也会编译出错。
关于c语言数组显示没有左值和数组不是左值的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。







