c在数学上表示什么含义(左值右值的基本解释)
左值右值什么是左值?什么是右值?左边的值和右边的值?不不不,这样不全面,先给你一个浅显的解释吧,左值就是可以被赋值的类型,右值就是不可以被赋值的值跟着下面的例子来一探究竟吧,我来为大家讲解一下关于c在数学上表示什么含义?跟着小编一起来看一看吧!
c在数学上表示什么含义
左值右值
什么是左值?什么是右值?左边的值和右边的值?不不不,这样不全面,先给你一个浅显的解释吧,左值就是可以被赋值的类型,右值就是不可以被赋值的值。跟着下面的例子来一探究竟吧。
最简单的左值右值
int a = 2;
这个代码中a位于等于运算符左边,数值2位于等于运算符右边,所以a是左值,2是右值。问题来了:那我要是把2放在左边,2是不是就成左值了呢?刚入门的c语言程序员都知道这是不可能的,但是我们还是来写一下,看看编译器报错了什么。
int a = 1; 2 = a;
当编译之后,给出以下报错:
[Error] lvalue required as left operand of assignment
翻译过来就是:左操作数需要赋值。也就是说左操作数必须可以被赋值,2可以被赋值吗?当然不可以了。
再来看一个例子:
int fun(){ return 4; } fun() = 2;
这个代码正确吗?肯定是错误的,为什么呢?因为函数不能被赋值,用左值右值来解释就是fun()函数是一个右值。不信的话我们来看看报错:
总的来说,c 左值是可以被赋值,可以获取到地址的值,右值表示无法获取地址的对象,有常量值、函数返回值、lambda表达式等。无法获取地址,但不表示其不可改变,当定义了右值的右值引用时就可以更改右值。
左值引用
我们知道c 中有引用这一概念,具体使用如下:
void function(int& a);
这样函数中,参数使用int类型变量传递的时候,就会被转化为引用了。那么问题来了,我要是放一个数字会怎么样呢?代码如下:
#include <iostream> using namespace std; int fun(int& a) return a; } int main(int argc, char** argv) { fun(2); return 0; }
报错如下:
[Error] invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int'
翻译过来就是:从类型'int'的右值中无效初始化类型'int&'的非常量引用。其实C 是禁止将右值绑定到左值引用的,那么怎么才能绑定呢?
右值,我们前面说过,它是不可被赋值的,不可被改变的,左值引用呢,可以被改变,那我们给左值引用加一个const试试。代码修改如下:
#include <iostream> using namespace std; int fun(const int& a){ return a; } int main(int argc, char** argv) { fun(2); return 0; }
这次编译通过了,其实c 允许使用const修饰左值引用,这样右值就可以绑定到左值引用上面了。
int &a = 1; //Error const int &a = 1; //Ok
右值引用
在c 中允许定义右值引用,如下:
int&& a = 1;
这样就可以访问右值引用的地址了。
左值右值、左值引用右值引用的相互转换
左值==>右值
当需要时,系统可以自动将左值转化为右值。例如:
int a = 1; int b = 2; int c = a b; //a、b被转化为右值
右值=/=>左值
右值到左值的转换目前还不行
左值==>左值引用
void function(int& a); int a = 5; function(a);
右值==>右值引用
int&& a = 1;
左值==>右值引用
c 中使用move语义将左值转化为右值引用,具体使用std::move()函数
int a = 5; int&& b = std::move(a);
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com