学习lvalue和rvalue。定义是“address of”是左值,否则是rvalue。
我检查了运算符的优先级,前缀和后缀增量都比“address of”运算符有更高的优先级。
对于下面的两个示例,谁能解释一下为什么第一个“&++value1”是lvalue,而第二个“&value1++”是RValue。
我对这两种情况的错误理解是:pValue1指向value1变量。无论在建立地址相关性之前还是之后,value1被改为8,value1变量总是占用一个内存位置,我们可以导出它的地址,对吗?
int value1=7;
int *pValue1=&++value1;
int *pValue1 = &value1++;
根据我的评论,您可以看到为什么编译器反对这种操作。问题在于postfix运算符++
的一般实现,它复制对象(在本例中是int
),递增原始对象并返回预递增的副本。您可以将其视为一个函数,该函数是以以下方式定义的:
int foo_operator(int& a)
{
int copy = a;
a += 1;
return copy;
}
如果您试图在您的示例中使用该函数,您的编译器也会对此提出抗议。该函数的返回值是一个RValue。
您现在可能会问-前缀操作符++
是怎么回事?那不也是一个返回值的函数吗?答案是-不。前缀运算符++
返回引用,而不是复制的值,因此它的“结果”可以与操作数&
一起使用。
我在互联网上搜索了一个很好的实现,它不是把数字表达式,而是把变量表达式从中缀符号转换成前缀和后缀。我做的所有搜索都没有成功。基本上,我想看看PHP中是否有任何实现,这样我就可以修改它以支持更多的操作符,而不仅仅是(-,*,=)。 例如转换: 同时保留变量名,不必输入数字进行计算。
代码 产出(如预期) 1.post increment运算符()在表中具有最高的优先级。因此它肯定会在赋值运算符()之前执行。根据post增量规则,变量的值只有在执行该语句之后才会增加。 参见有rvalue 3,而不是变量本身,对吗?但是如果它带来了一个具有lvalue的变量,那么5将插入其中,在语句结束后,它的值将是6。这有什么问题,为什么做不到?
问题内容: 我了解对此主题有很多疑问。但是我仍然有些困惑,不确定何时使用这些操作。我正在为参加考试而做的旧考试。其中一种方法返回可访问的残疾人可用教室的数量。我编写了counter方法,但不确定是应该先递增还是递后递增计数器。我对它如何与方法中的return语句混淆。我仍然不知道该方法将在下面返回什么值。其他问题未在方法中显示返回值,因此我对它的工作方式感到困惑。这是代码: 问题答案: 当您要在表
问题内容: 我最近为Eclipse安装了Checkstyle插件,并个人认为它很棒。但是它给我的警告之一有些晦涩。确切的警告是“ 不允许使用”。它是关于后缀在某行像 好的,我知道这是更好的迭代构造,但是它不能在所有地方都应用,有时老套是唯一的选择。 当我将行更改为 警告消失。我知道之间的区别,并和这一点我的生活我认为他们在标准的可互换建设。但是Checkstyle认为这是有害的(或容易出错)。 问
问题内容: 从下面或此处的程序中,为什么最后一次调用要打印该值7? 问题答案: 这将打印出“ 6”,因为它将i加1并返回值。5 + 1 = 6;这是前缀,在操作中使用该编号之前会添加该编号。 这将打印出“ 6”,因为它需要i,存储副本,加1并返回副本。因此,你获得了我当时的价值,但同时又增加了它。因此,你可以打印出旧值,但是它会增加。后缀增量的好处。 然后,当你打印出i时,它会显示i的实际值,因为
问题内容: 当我运行以下示例时,我得到输出0,2,1 我不明白为什么输出是0,2,1而不是0,2,2 问题答案: 意思是现在。调用打印,但返回0,所以和 在此之前,现在想象被调用并替换为0 所以 现在它将是 用简单的话(从这里 @ Piotr) “ i = i ++”大致翻译为 另一个这样的例子: 同样的基本原理