1

“左值到右值的转换不是在一元 & 运算符的操作数上进行的。”

我可以知道这意味着什么>任何人都可以解释一下..请

前任:

 int a[]={1,5};
 int* x=&a; 
4

3 回答 3

3

好吧,这意味着左值到右值的转换没有完成:-)。当您需要对象的值而不仅仅是对它的引用时,就会发生左值到右值的转换。获取对象的地址不需要值,因此没有左值到右值的转换。

我不确定这与您的代码有什么关系。代码第二行中未完成的转换是数组到指针的转换。当然,左值到右值的转换也没有完成,但这是相当直观和正常的。然而,数组到指针的转换发生在表达式中数组的大多数使用中,因此可能会让一些人更加惊讶。(实际上,数组到指针的转换只在必要时发生。但是在数组上合法的操作非常非常少,所以经常需要。)对于一元 & 运算符,数组到指针的转换不会' 不会发生(也不会发生,因为数组到指针转换的结果是一个右值,而一元 & 需要一个左值)。所以你正在获取数组的地址,)[2],即指向两个int数组的指针。这反过来又使赋值非法,因为目标类型不是 int ( )[2],而是 int*,并且两者之间没有隐式转换。

于 2010-11-18T12:06:10.357 回答
1

在表达式中,左值右值的转换是指查看对象的值,并在需要对象值的地方使用(例如,在a + b您需要的值ab确定结果时,您不需要知道在哪里 - 如果任何地方 - 原始对象来自)。

地址运算符中,您需要拥有对象本身(即左值),对象的值无关紧要,因此左值右值的转换将无济于事,它会丢失对象本身的身份(位置),即什么是重要的地址。

于 2010-11-18T09:26:20.637 回答
1
int a[] = {1, 5};
int* x = &a;

那是类型错误。&运算符产生一个指向其操作数的指针。它的操作数是什么?2 个整数的数组。指向2 个整数数组的指针不是类型int*,而是类型 int(*)[2]

请注意您引用的规则在此处如何应用:在许多情况下,数组的名称衰减为指向其第一个元素的指针。(但一般来说,数组和指针是一样的!)当你说int* x = a;. 但是,当您将运算符应用于数组时,不会发生这种衰减。&(如果确实发生了这种转换,&a将尝试获取 的地址a,这是无稽之谈。)

于 2010-11-18T11:05:42.587 回答