【发布时间】:2012-09-14 23:00:14
【问题描述】:
int main(void) {
int x = 0;
int* p = &x;
char* q = p;
while (*p == *q) { //What happens here?
x = x + 1;
}
printf(“%d\n”, x);
}
我这里有这个简单的程序。我对这是如何工作的感到困惑。如果你能帮助我,我将不胜感激。
我有一个测试,想了解它是如何工作的。提前谢谢你。
Q 指针问题
|---------------|
0x00
|----------------------------|
0x00
|----------------------------|
0x00
|----------------------------|
0x00
|----------------------------|
所以在 x = x+1 之后。是吗?
|---------------|
0x00
|----------------------------|
0x00
|----------------------------|
0x00
|----------------------------|
0x00
|----------------------------|
【问题讨论】:
-
@Jim Balter:see on codepad
-
你的意思是什么?行为是未定义的,所以虽然它可能在键盘上(今天)做一件事,但明天它可能会做一些不同的事情,或者在其他编译器和实现中。
-
@JimBalter:呃……嗯,那是去年的考试。所以,我必须研究它,所以如果他提出类似的问题,我就会知道答案。
-
所以不及格教练......或给出正确答案:这是未定义的行为。或者问题是否提供了您未能在此处提供的架构的详细信息?
-
@JimBalter 您能否详细说明行为未定义的程度?转换为
char*是合法的,如果我理解正确,也可以取消引用char*。无论您获得最低有效字节,最高有效字节还是另一个字节都未指定,但它是最低寻址字节。如果int的宽度大于CHAR_BIT + 1,则x = x+1;在值变得不相等之前不会溢出,所以我看不到UB,只有打印的值取决于实现。还是我忽略了什么?