【问题标题】:C Comparison TypesC 比较类型
【发布时间】: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,只有打印的值取决于实现。还是我忽略了什么?

标签: c types char int


【解决方案1】:

首先,pq 被取消引用(通过 *)以获取它们指向的 int 和 char。然后,将 char 提升为 int,并比较值是否相等。

【讨论】:

  • 在这种情况下,第二次我将 x 加 1,它将停止,因为 q 将是 0p = 1;
  • @bluejamesbond,他们都指向x。不同之处在于qchar *,这意味着*q 的值取决于Corbin 所说的字节序。
【解决方案2】:

这取决于字节顺序,但本质上是:

while (x == ((char) x)) {
    ++x;
}

循环将终止一次((int) x) != ((int) lowest byte of x)

【讨论】:

  • @bluejamesbond 啊,我想那是因为 1000000 将被解释为已签名:)。
  • '它本质上'——由于行为是未定义的,一些实现可能碰巧像那样工作。其他人肯定不会。
  • Corbin 和@chris:我已经添加到问题中。你能帮我做这部分吗?谢谢。
  • @JimBalter:好的,我明白了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 2019-09-28
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
相关资源
最近更新 更多