int &y=x
与int y=&x
相同吗?
s++
和*s++
是否相同?
同样在下面的代码中,为什么*s++
会给我一些错误的结果?
我期待*s
值为12
#include <iostream>
using namespace std;
int main()
{
int p=10;
int &q=p; //q is a reference variable to p
//int r=&p; //error: invalid conversion from 'int*' to 'int'
int *s=&p; //valid
q++;
*s++; //here even s++ works, and cout<<*s does not give 12 but some lengthy number
//and cout<<s gives some hexadecimal, I'm guessing thats the address
cout<<p<<endl<<q<<endl<<*s;
}
我得到的输出:
11 11 6422280
答案 0 :(得分:3)
int &y=x
与int y=&x
相同吗?
没有。他们是非常不同的。
int x;
int& y = x; // y is a reference to x.
另一方面,
int x;
int y = &x; // Should be compiler error.
// Initializing y with a pointer.
该行:
*s++;
相当于:
int* temp = s;
s++;
*temp;
您正在评估*temp
,但副作用是您正在递增s
。之后s
指向下一个元素。但这不是一个有效的地址。下次访问*s
时,程序会显示未定义的行为。该行的输出:
cout<<p<<endl<<q<<endl<<*s;
可以是任何东西。
答案 1 :(得分:3)
与int &y=x
相同的{p>int y=&x
。
在第一个y
中是一个整数引用,它被初始化为x
。 OTOH,您要尝试为int
分配int *
值,这会导致编译错误。
为什么* s ++会给我一些错误的结果?我期待* s值为12
这是因为++
优先于*
,因此,首先s
首先递增(因此指向未初始化的内存位置),然后取消引用
导致取消引用未初始化的内存位置导致未定义的行为。
如果您想要预期价值,可以这样做 -
(*s)++; //dereference first and then increment
答案 2 :(得分:1)
int &y=x
与intint y=&x
相同吗?
不近。第一个将x
绑定到int
- 引用y
,第二个将int
y
初始化为地址x
。
两者都可以干净利落地进行编译,但仅次于严重扭曲,operator overloading:
{
int y;
int& x = y;
}
{
// Only for demonstration, never do something this crazy for real
struct { int operator&() { return 0; }; } x;
int y = &x;
}
s++
和*s++
是否相同?
当然不是,虽然它们在你的例子中具有相同的效果,但是你放弃了结果:
s
并返回其预增量值。在这两种情况下,s
此后都指向一个对象,并且可能不会在Undefined Behavior (UB)的痛苦中取消引用。
这解释了你得到的奇怪数字,但也可能导致你的程序只打印42
然后开始重新格式化你的硬盘(合法但不太可能)。