c和c+中l值的含义是否不同+;?

c和c+中l值的含义是否不同+;?,c,C,我被告知数组名在C中是不可修改的l值,但它仍然令人困惑 有人说数组名不能放在公式的左边,因为它被转换为一个不是l值的指针 我的问题是: 数组名是否为l值 在C和C++中,L值是什么?有什么区别吗? 数组名是否为l值 是,C和C++两种。 在C和C++中,L值是什么?有什么区别吗? 是的,但意义不大。以下是C11第6.3.2.1/1段中的定义: 左值是可能指定对象的表达式(对象类型不是void) C还包括一个脚注(#64),对其进行了扩展,其中包括: 名称“左值”最初来自赋值表达式E1=E2,其中

我被告知数组名在C中是不可修改的l值,但它仍然令人困惑

有人说数组名不能放在公式的左边,因为它被转换为一个不是l值的指针

我的问题是:

  • 数组名是否为l值
  • 在C和C++中,L值是什么?有什么区别吗?
  • 数组名是否为l值
  • 是,C和C++两种。

    在C和C++中,L值是什么?有什么区别吗? 是的,但意义不大。以下是C11第6.3.2.1/1段中的定义:

    左值是可能指定对象的表达式(对象类型不是void)

    C还包括一个脚注(#64),对其进行了扩展,其中包括:

    名称“左值”最初来自赋值表达式
    E1=E2
    ,其中左操作数
    E1
    必须是(可修改的)左值。它可能更好地被认为是代表一个对象 “定位器值”。[…]安 左值的明显例子是对象的标识符

    以下是C++14第3.10/1段中的定义:

    左值(历史上称为左值,因为左值可能出现在 赋值表达式的左侧)指定函数 或者一个物体

    <>如果你仔细阅读,你会注意到,在C中,一个LValk只可能指定一个对象,而在C++中,没有为未实现的潜力留有余地——LValk确实指定了一个对象或函数。然后,您会注意到C++在其LValk中包含函数标识符,而C没有。在实践中,这些区别更多的是技术性的,而不是深刻的意义。它们都不会影响你问题(1)的答案

    您还将注意到,这两个定义都不是根据左值的使用方式或位置编写的。根据定义和其他规范确定的;这不是一个决定性的特征

    在C和C++中,数组的标识符指定一个对象-数组,因此它是一个LValk。在赋值表达式中,这样一个左值是否实际显示为左操作数是一个完全不同的问题。

    在C语言中:

    6.3.2.1左值、数组和函数指示符 1左值是一个可能 指定一个对象;64)如果左值在计算时未指定对象,则 行为是未定义的。当一个对象被称为具有特定类型时,该类型为 由用于指定对象的左值指定。可修改左值是指 不具有数组类型、不具有不完整类型、不具有常量限定类型,并且如果是结构或联合,则不具有任何成员(包括, 递归地,所有包含的聚合或联合的任何成员或元素)具有常量限定类型。

    2除非它是
    sizeof
    运算符的操作数,否则 一元
    &
    运算符、
    ++
    运算符、
    -
    运算符或
    运算符的左操作数
    或赋值运算符,则将不具有数组类型的左值转换为
    存储在指定对象中的值(不再是左值);这就是所谓的左值
    转变如果左值具有限定类型,则该值具有
    左值类型;此外,如果左值具有原子类型,则该值具有非原子类型
    左值类型的版本;否则,该值的类型为左值。如果
    左值的类型不完整且没有数组类型,行为未定义。如果
    左值指定了一个自动存储持续时间的对象,该对象可以
    使用
    寄存器
    存储类声明(从未获取其地址),以及该对象 未初始化(未使用初始值设定项声明,且未对其进行赋值) 使用前执行),行为未定义。

    3除非它是
    sizeof
    运算符、
    \u
    运算符或 一元
    &
    运算符,或者是用于初始化数组的字符串文字,一个具有 类型“”的数组“”已转换为类型为“”指向类型“”的指针的表达式 指向数组对象的初始元素,并且不是左值。如果数组对象具有
    注册
    存储类,行为未定义。
    64)名称“左值”最初来自赋值表达式
    E1=E2
    ,其中左 操作数E1必须是(可修改的)左值。也许最好把它看作是代表 对象“”定位器值“”。本国际标准中描述了有时称为“右值”的内容 作为“表达式的值”。

    左值的一个明显例子是对象的标识符。作为进一步的示例,如果
    E
    是一元数 表达式是指向对象的指针,
    *E
    是一个左值,用于指定
    E
    指向的对象。

    总结:

    数组表达式(即任何数组类型的表达式)实际上是左值;但是,除非它是
    sizeof
    \u Alignof
    或一元
    &
    运算符的操作数,否则该表达式将转换(“衰减”)为指针类型的表达式,其值为第一个元素的地址
    T a[N]; // for any type `T`