当前位置:首页 » 编程软件 » 编译程序必须修改左值吗

编译程序必须修改左值吗

发布时间: 2022-05-28 02:42:52

㈠ C++左值问题

要准确理解左值和右值的概念,首先需要明确我们指的是 C 还是 C++ 中的左值或右值。这是因为 C 和 C++ 对于左值及右值的定义是有区别的。另外,左值和右值的概念人为规定的成份很大,往往给出的定义不能囊括所有情况。

>> 《TCPL》A.5:An object is a named region of storage, an l-value is an expression referring to an object.

对于 C 语言来说,这个定义就不是太准确,特别在 C99 标准出台之后更是如此。这个定义中规定了“对象(object)”是“有名存储区(a named region of storage)”。且不说动态分配的内存(无名存储区)能否作为对象,只就 string literal 以及在 C99 中新增加的 Compound litertal 而言(它们都是对象,并且都是左值,但是又都是没有名字表示的),就不在上述定义的界定范围之内。

对于 C++ 来说,这个定义就更不适用了。因为 C++ 中对象也可能是一个非左值,即右值。同理,ISO/IEC9899 中为 C 语言提供的左值的定义也不适用于 C++。

>> "lvalue"还可以分为一般的"lvalue"和"modifiable lvalue"。

这句话说得比较别扭。是否可改为 "lvalue" 还可以分为"modifiable lvalue" 和 "unmodifiable lvalue"?

>> "lvalue"必须对应于一块确定的内存空间,并且在编译时已经确定了

《ISO/IEC9899 WG14/N1124》P58:An l-value is an expression with an object type or an incomplete type other than void.

根据上述定义,对于非 void 的非完整类型(incomplete type)的引用也是左值;而我们知道在程序中对于非完整类型是不能进行引用的,否则会在编译时产生错误。

因此,左值只是对应着某一存储空间,而与此存储空间是否真实存在、是否能够实际访问无关,更谈不上是在编译时确定的了——这显然否定了动态分配的对象也可以是左值。

>> "lvalue"可以作为"rvalue",但是"rvalue"不一定可以作为"lvalue"来使用。

左值和右值的概念是对立的,即非左即右(根据C++标准对左值的定义,C标准没有明确这么说)。左值可以作为右值是因为 C 和 C++ 标准中规定的 lvalue-to-rvalue 转换所致,但是右值不是“不一定”、是一定不能作为左值来使用。

>> 它是"lvalue"而且还是"modifiable lvalue",要不然如何初始化呢?

左值对象都可以被初始化,即使是对于不能改变的左值也是如此。否则,如果不能初始化你又如何使用它呢?因为未初始化就使用是非法的。显然上面一句的“初始化”应该是“赋值”的笔误。

㈡ C语言,提示:表达式必须是可修改的左值

= 改成== =是复值 ==是逻辑上的等于
-------------------------------------------
还有 sqrt返回值是double型的
因为i是float型,所以printf("%d",i);改为printf("%f\n",i);
}; 这里不要加分号

㈢ C语言表达式必须是可修改的左值

b > max ? max = b : max = max;
这句的符号优先级有点乱,你这句等同于
(b > max ? max = b : max) = max;
(b > max ? max = b : max)的结果是个常量,当然不可以修改(就是左值)

㈣ 在c的编译器中”,”运算符是不能做为左值的,但在C++中可以是吗

在C语言中,左值(left value),指在赋值表达式(assignment expression)中作为将要赋予值的地址的表达式。

例如在赋值语句

1

i = 10;

中i就是一个左值,它必须是一个变量,或是一个解引用的指针(如下)

1
2

int *p;
*p = 10;

在C的yacc语法中,赋值表达式被这样定义

assignment_expression
: conditional_expression
| unary_expression assignment_operator assignment_expression
;

也就是说,在纯语法的层面,左值必须是一元表达式

㈤ 表达式必须是可修改的左值是什么意思

就是说= 左边必须是变量,x%i是表示,所以不能赋值
if (x%i==0)break; 应该是 ==

㈥ C语言中表达式必须是可修改的左值是什么意思

意思是赋值号左侧的是只能是变量,不能是表达式。

通过变量名来访问变量,是一种“相对安全”的方式。因为只有你定义了它,你才能够访问相应的变量。这就是对内存的基本认知。但是,如果光知道这一点的话,其实还是不知道内存是如何存放变量的,因为底层是如何工作的,依旧不清楚。

要继续深究的话,就需要把变量在内存中真正的样子是什么搞清楚。内存的最小索引单元是1字节,那么你其实可以把内存比作一个超级大的“字符型数组”。数组是有下标的,我们是通过数组名和下标来访问数组中的元素。

(6)编译程序必须修改左值吗扩展阅读

那么内存也是一样,只不过起了个新名字:地址。每个地址可以存放“1字节”的数据,所以如果我们需要定义一个整型变量,就需要占据4个内存单元。

其实在程序运行的过程中,完全不需要变量名的参与。变量名只是方便进行代码的编写和阅读,只有程序员和编译器知道这个东西的存在。

而编译器还知道具体的变量名对应的“内存地址”,这个是我们不知道的,因此编译器就像一个桥梁。当读取某一个变量的时候,编译器就会找到变量名所对应的地址,读取对应的值。

㈦ C++表达式必须是可修改的左值

就是说= 左边必须是变量,x%i是表示,所以不能赋值
if (x%i==0)break; 应该是 ==

isLeapYear (d) == true && d.month = 2

() == && . 这几个运算符的优先级高于 =
所以你写的表达式的含义是

( isLeapYear (d) == true && d.month ) = 2

( isLeapYear (d) == true && d.month ) 不是可修改的左值
甚至连左值都不是

所以你的式子类似于 1 = 2
显然是错误的

我猜你要表达的是
isLeapYear (d) == true && d.month == 2

你错把 == (等于)写成了 = (赋值)

㈧ vs c++编译程序后提示 表达式必须是可修改的左值 是怎么回事儿啊如下

你是不是想写成if(m%i
==
0),对比要使用==,一个等号=为赋值运算符,左值是指=左边必须为一个可修改的变量,m%i是一个表达式,不可修改,所以提示错误。
建议在比较时,尽量将常量放到左测,这样更容易发现问题,如:if(0
==
m%i)。
满意请采纳。

㈨ C++指针引用问题,非常量引用的初始值必须为左值

“非常量引用的初始值必须为左值”,左值基本上可以理解为能对其取地址的值,如果地址都没有,怎么可能作为非常量引用的值呢?如果可以,那么将出现以下情况:
int &a = 5;//5是右值,a是非常量引用
a = 6;//把5这个右值的值改为6,这明显是不合适的

“在参数里取地址再传进去就允许”这个不是很明白你想表达什么,对右值取地址?

㈩ C语言语法问题,左操作数必须为左值是什么意思啊我该怎么改啊

所谓左值是指一个能用于赋值运算左边的表达式。左值必须能够被修改,不能是常量。我们用变量作左值,还可以看到,指针和引用也可以作左值。改成b=9-c。
一般形式为:变量=表达式。它的作用是将一个表达式的值赋给一个左值。
计算赋值运算符右侧表达式的值(“=”为赋值运算符),将赋值运算符右侧表达式的值赋给左侧的变量,将赋值运算符左侧的变量的值作为表达式的值。
例如:
int
a,
b,
c;
a=3;
b=4;
c
=
(
a
+
b
)*(2*a
-
b)
//
得出14
(10)编译程序必须修改左值吗扩展阅读:
注意
1.
多重赋值表达式不能出现在变量说明中。例如:
int
i=j=0;
是非法的。
例:有变量说明
int
a=2,b;
指出下面表达式运算后a和b的结果。
b+=b=++a;
答:a为3,b为6。
<>
有时将赋值运算与比较运算结合在一起形成嵌入赋值。例如:
while
((ch=getchar())!='\n');
这条语句的含义是:等待用户按下回车键后程序向下执行。
2.
x
*=
y+8等价于x=x*(y+8),不等价于
x
=
x*y+8。
同样:z
&=
y-x等价于z
=
z
&
(y-x),而不等价于z
=
z
&y
-x。
参考资料:
搜狗网络-赋值运算符

热点内容
java返回this 发布:2025-10-20 08:28:16 浏览:645
制作脚本网站 发布:2025-10-20 08:17:34 浏览:936
python中的init方法 发布:2025-10-20 08:17:33 浏览:632
图案密码什么意思 发布:2025-10-20 08:16:56 浏览:821
怎么清理微信视频缓存 发布:2025-10-20 08:12:37 浏览:731
c语言编译器怎么看执行过程 发布:2025-10-20 08:00:32 浏览:1066
邮箱如何填写发信服务器 发布:2025-10-20 07:45:27 浏览:299
shell脚本入门案例 发布:2025-10-20 07:44:45 浏览:160
怎么上传照片浏览上传 发布:2025-10-20 07:44:03 浏览:852
python股票数据获取 发布:2025-10-20 07:39:44 浏览:763