“左值到右值的转换不是在一元 & 运算符的操作数上进行的。”
我可以知道这意味着什么>任何人都可以解释一下..请
前任:
int a[]={1,5};
int* x=&a;
“左值到右值的转换不是在一元 & 运算符的操作数上进行的。”
我可以知道这意味着什么>任何人都可以解释一下..请
前任:
int a[]={1,5};
int* x=&a;
好吧,这意味着左值到右值的转换没有完成:-)。当您需要对象的值而不仅仅是对它的引用时,就会发生左值到右值的转换。获取对象的地址不需要值,因此没有左值到右值的转换。
我不确定这与您的代码有什么关系。代码第二行中未完成的转换是数组到指针的转换。当然,左值到右值的转换也没有完成,但这是相当直观和正常的。然而,数组到指针的转换发生在表达式中数组的大多数使用中,因此可能会让一些人更加惊讶。(实际上,数组到指针的转换只在必要时发生。但是在数组上合法的操作非常非常少,所以经常需要。)对于一元 & 运算符,数组到指针的转换不会' 不会发生(也不会发生,因为数组到指针转换的结果是一个右值,而一元 & 需要一个左值)。所以你正在获取数组的地址,)[2],即指向两个int数组的指针。这反过来又使赋值非法,因为目标类型不是 int ( )[2],而是 int*,并且两者之间没有隐式转换。
在表达式中,左值到右值的转换是指查看对象的值,并在需要对象值的地方使用(例如,在a + b
您需要的值a
和b
确定结果时,您不需要知道在哪里 - 如果任何地方 - 原始对象来自)。
在地址运算符中,您需要拥有对象本身(即左值),对象的值无关紧要,因此左值到右值的转换将无济于事,它会丢失对象本身的身份(位置),即什么是重要的地址。
int a[] = {1, 5}; int* x = &a;
那是类型错误。&
运算符产生一个指向其操作数的指针。它的操作数是什么?2 个整数的数组。指向2 个整数数组的指针不是类型int*
,而是类型 int(*)[2]
。
请注意您引用的规则在此处如何应用:在许多情况下,数组的名称衰减为指向其第一个元素的指针。(但一般来说,数组和指针是不一样的!)当你说int* x = a;
. 但是,当您将运算符应用于数组时,不会发生这种衰减。&
(如果确实发生了这种转换,&a
将尝试获取 的地址a
,这是无稽之谈。)