Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 常量表达式和不可修改的左值之间有什么区别?_C - Fatal编程技术网

C 常量表达式和不可修改的左值之间有什么区别?

C 常量表达式和不可修改的左值之间有什么区别?,c,C,简而言之,从C开始: 常量表达式 编译器识别源代码中的常量表达式 并用它们的值替换它们。得到的常量值 必须在表达式的类型中表示。您可以使用常量 表达式,只要允许使用简单常量 运营商 常量表达式遵循与其他表达式相同的规则 表达。因为常量表达式是在转换时计算的 但是,时间不能包含 修改变量,例如赋值 什么是常量表达式?它不定义常量表达式 常量表达式和不可修改的左值(例如数组名、已用const声明的左值)之间有什么区别 常量表达式总是非左值吗 不可修改的左值是常量表达式吗 常量表达式是编译期间

简而言之,从C开始:

常量表达式

编译器识别源代码中的常量表达式 并用它们的值替换它们。得到的常量值 必须在表达式的类型中表示。您可以使用常量 表达式,只要允许使用简单常量

运营商 常量表达式遵循与其他表达式相同的规则 表达。因为常量表达式是在转换时计算的 但是,时间不能包含 修改变量,例如赋值

  • 什么是常量表达式?它不定义常量表达式

  • 常量表达式和不可修改的左值(例如数组名、已用
    const
    声明的左值)之间有什么区别

  • 常量表达式总是非左值吗

  • 不可修改的左值是常量表达式吗


  • 常量表达式是编译期间已知(可以计算)值的表达式

    埃克斯枫树

    int a = 5+5+3;  //5 + 5 +3 
    char []= "Hello"; // string literal "hello"
    
    不可修改的左值是不变的对象和不变的支出

    枫树

    const char c;
    c = '3';
    
    '3' = c;
    
    可修改左值必须是可寻址的(即您可以使用&)和可赋值的(即它们可以位于赋值运算符的左侧)。唯一的例外是没有地址的寄存器变量

    什么是常量表达式

    §6.6-常数表达式:

    常量表达式可以在转换过程中而不是在运行时进行计算,因此可以在常量所在的任何位置使用

    常量表达式的约束之一是


    常量表达式不得包含赋值、递增、递减、函数调用或逗号运算符,除非它们包含在未计算的子表达式中115)


    常量表达式和不可修改的左值之间有什么区别

    不可修改的左值不是常量表达式不可修改的值是不能用于修改对象的左值

    int const i = 5;
    
    i
    指的是常量对象,但它是一个左值,一种特殊的左值,称为不可修改左值

    无论标准在哪里提到“左值”,它实际上意味着“可修改的左值”(为了清晰起见,您在标准中找不到这一点)

    现在让我再解释一下

    int x = 5;
    int const *p;
    
    x
    是一个非常量对象,是一个可修改的左值
    p
    是指向
    const int
    对象的指针

    p = &x;  // This will raise a warning though and hazardous to do.
    
    上述赋值使用限定转换将指向
    int
    的指针类型的值转换为指向
    const int
    的指针类型的值
    *p
    x
    是指同一对象的两个不同表达式。可以使用
    x

    --x;  
    
    但是这不能用
    *p
    来完成,因为它是不可修改的左值

    --(*p); // Error
    
    常量表达式和不可修改的左值之间的另一个区别是

    int const x = 5;
    int *p;
    /* Assigning address of a non-modifiable object */
    p = &x      // Correct
    /* Assigning address of a constant expression */
    p = &5      // Wrong  
    
    常量表达式总是非左值吗

    是的,常量表达式总是非左值,即右值

    不可修改的左值是常量表达式吗

  • 常量表达式定义在:

    说明

    。常量表达式可以在转换过程中而不是在运行时进行计算,因此可以在常量所在的任何位置使用

    约束条件


    常量表达式不得包含赋值、递增、递减、函数调用或,除非它们包含在未计算的子表达式中。115)

    每个常数表达式应计算为其类型的可表示值范围内的常数

    有几种类型的常量表达式可以在一个位置中使用。存在计算为的常量表达式

    • 一个算术常数表达式,
      • 这种情况的一个特例是整数常量表达式,例如允许作为(静态分配的)数组的大小或位字段宽度
    • 一个空指针常量
    • 地址常量,或
    • 完整对象类型的地址常量加上或减去整数常量表达式
  • 左值或定位器值(可能)指定对象。您可以获取左值的地址。可修改左值和不可修改左值之间的区别在于后者不能用作赋值的左侧。或

    可修改左值是一个左值,它不具有数组类型、不具有不完整类型、不具有常量限定类型,并且如果它是结构或联合,则不具有任何具有常量限定类型的成员(递归地包括所有包含的聚合或联合的任何成员或元素)

    不可修改的左值是不可修改的左值

    常量表达式只是。。。价值观它们不在内存中-没有数字42的地址-
    &42
    没有意义

  • 因此,常量表达式总是非左值。它们不指定对象。您不能使用
    6*9
    的地址

  • 没有,但是。。。数组类型的左值隐式地衰减为指向数组的指针,这些指针是地址常量。然而,当他们被如此转化时,他们就不再是左撇子了


  • 我认为有不止一个复杂的问题,让我试着用一种简单的方式来回答它(主要是通过公然复制粘贴标准,只是自己创建一个保留连接)

    一,。什么是常量表达式

    C11
    ,第§6.5章,
    表达式

    <