【问题标题】:How are these characters produced?这些角色是如何产生的?
【发布时间】:2015-08-10 19:41:43
【问题描述】:
int main(void)
{
char s[] = "Hsjodi", *p;
for(p = s; *p; p++)
    --*p;
    puts(s);
  return 0;
}

输出写入 Grinch,但我无法理解这段代码是如何执行的。当G,r,i 等字母在char 数组中不存在时,它如何写出Grinch,以及循环何时终止我们的确切*p 是什么意思?

【问题讨论】:

  • --*p正在递减p指向的当前字符,这样H变成Gs变成r等等。
  • @EugeneSh。这并不能解释 G 的来源。
  • 不解释示例的书籍一文不值。使用不明智的“棘手”或“聪明”代码的书籍比毫无价值更糟糕。如果本书使用您示例的“随机缩进”样式,那应该从一开始就敲响警钟。首先,所以没有人会犯错误购买这本书,至少告诉我们书名和作者,其次将这本书降级为支撑你的显示器。快速搜索显示此代码已用于阿拉巴马大学的课程试卷中 - 所以我想知道是否真的有一本“书”说明你是否只是试图在某些作业上作弊?
  • @Rob 恐怕我不懂你们的 cmets。 p 最初指向一个包含“Hsjodi”的字符串,所以所有的数据都是从那里获取的。
  • @Rob 'G' 是输入 'H' 的计算的输出。

标签: c loops pointers


【解决方案1】:

首先,注意for循环没有任何大括号来创建块,所以循环体只有

--*p;

相同
--(*p);

现在,根据上述声明,数组中的所有元素,直到终止 null,都减少了一个位置。这意味着,H 现在是 Gs 现在是 r 等等。注意

另外,循环中的条件检查*p*p != '\0'*p != 0 的简写形式。

通过循环递减后,修改后的数组已经通过puts()打印出来了。


注意:您可能需要查看ASCII table 以供参考。

【讨论】:

  • @Rob 对不起,我不明白。这是什么?
  • @Rob p 指向 s,它是一个包含字符 'Hsjodi\0' 的字符串,所以 *p 最初是字母 'H'
  • @FredK 是的,--(*p) 指向什么?我认为 p 从未指向任何 ASCII 表。
  • @Rob 它不是关于 ASCII table,注意循环中的初始化,p = s,也就是说,在开头,p 指向s 中的数组,我们继续递增指针,直到到达包含空终止符的地址,该地址具有十进制值 0
  • 现在我可以解释了(我在一个很难思考的机场打电话)。此代码对数组的每个元素进行排序,并将其值减一。该值等于它前面的字符,在这种情况下,它会拼出“Grinch”。你提到的 ascii 表让我感到困惑。我没有注意到“减少角色”部分。
猜你喜欢
  • 2013-12-16
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 1970-01-01
  • 2012-09-11
相关资源
最近更新 更多