【问题标题】:What does an expression like arr[''hi there"] imply?像 arr[''hi there"] 这样的表达式意味着什么?
【发布时间】:2011-07-20 19:27:14
【问题描述】:

如果 a=3 和 b=5,这意味着什么?

printf(&a["Ya!Hello! how is this? %s\n"], &b["junk/super"]);

我知道arr[4] 表示*(arr+4),所以我需要知道"hi there" 这样的表达式意味着什么?

编辑 - 问题可能更清楚:

当一个字符串用作数组下标时,它传递什么值?

为什么上面的输出是Hello! how is this? super

【问题讨论】:

  • 您是在问如果使用 a[3] 和 b[2] 作为数组位置会得到什么?
  • 我真的希望这只是一个“学术”代码 sn-p 而不是实际用于生产的东西。
  • 我什至不知道你所说的“你好”是什么意思?
  • 这意味着,立即逃离代码。如果这是来自教授,则意味着教授不知道何时将示例标记为不好。如果这是来自生产代码,则意味着您在错误的公司雇用。
  • 有趣。似乎有人想索引一个常量字符串,并且不愿意将它分配给一个变量。以混淆任何后来者为代价......

标签: c arrays


【解决方案1】:

这意味着,printf 变得等价于:

printf("Hello! how is this? %s\n", "super");

将打印:

Hello! how is this? super

在线演示:http://ideone.com/PVzUP

说明:

当我们写char s[]="nawaz; 然后s[2] 表示字符串s 中的第三个字符。我们可以通过写"nawaz"[2] 来表达这一点,这也意味着字符串"nawaz" 中的第三个字符。我们也可以写2["nawaz"],这也意味着字符串中的第三个字符。在您的代码中,printf 使用最后一种形式,即 2["nawaz"] 的形式。不过,这很不寻常。

所以a["Ya!Hello! how is this? %s\n"] 表示字符串中的第4 个字符(因为a 的值是3),如果你在a 前面加上& 那么&a["Ya!Hello! how is this? %s\n"] 返回地址 字符串中的第 4 个字符,这意味着,在 printf 中它变得等价于:

Hello! how is this? %s\n

我希望你能自己解释其余的。

【讨论】:

  • 我仍然对“你好”的问题感到困惑......:\
  • @nawaz:OP 将 b 更新为 b = 5,这会更改您的答案输出。
  • @j.w.r:我相应地更新了我的答案。感谢您告知。 :-)
  • @Soren:OP 已将b 的值从2 更改为3。无论如何,我相应地改变了我的答案。
  • @0A0D 我真的不明白“像 这样的表达式意味着什么?”是什么意思。我认为它应该类似于“表达式 在这种情况下如何解释?”。 "hi there" 是字符串文字;它的类型为const char[9]2["hi there"] 等价于*(2 + "hi there");在这种情况下,数组衰减为一个指针(类型const char*),然后将一个整数添加到一个指针,然后表现正常。
【解决方案2】:

如果arr[4] 表示*(arr+4),则4[arr] 表示*(4+arr)。由于指针和整数之间的加法是可交换的,所以它们是相同的。

如果您在 C++ 中使用具有重载运算符的对象,答案可能会大不相同。在这种情况下,您的问题还不够完整。

【讨论】:

  • 我不认为这是问题......
  • @Sidyll - 我认为这就是问题的答案。
  • @sidyll,这正是问题所在。将4 替换为ab,灯泡应该会发出咔哒声。
  • @Mark 是的,我知道,但是使用文字?嗯,我认为这没有意义。至少在 C 中。
  • @Mark Ransom:是的,它有效:ideone.com/kMbMn Impressive。很抱歉我这么傻,碰巧我用 C 工作的越多,我知道的就越少。
【解决方案3】:

如果ab 是整数,那么这两行是等价的:

printf(&a["Ya!Hello! how is this? %s\n"], &b["junk/super"]);
printf(&("Ya!Hello! how is this? %s\n"[a]), &("junk/super"[b]));  

这是一个有趣的阅读:http://www.gotw.ca/gotw/086.htm

【讨论】:

  • 这是我看到的第一篇解释 Nawaz 答案中的输出的帖子。很有趣。
  • @sun 好的,那么抱歉,我没有收到您的问题。也许阅读仍然很有趣;-)
【解决方案4】:

"hi there" 的类型是const char[9],9 个字符的数组。

考虑到这一点,如果 a 介于 0 和 8 之间,我们可以使用 "hi there"[a] 对该数组进行索引。

正如你所说,x[i] 等价于*(x + i)*(i + x),因此也等价于i[x]。所以我们可以把"hi there"[a]写成a["hi there"]来迷惑大家。

【讨论】:

    【解决方案5】:

    如果 a=3 和 b=5 这意味着什么

    printf(&a["Ya!Hello! 这是怎么回事?%s\n"], &b["junk/super"]);

    [] 运算符在原始 C 定义中只是一个偏移操作,在汇编程序中被翻译为

       x[y] => (addr = x + y; fetch content at addr)
    

    所以 x 通常是一个指针,而 y 是该指针的索引,那么汇编器并不关心你是否切换它们。

    所以代码等价于更易理解的版本

       printf(&("Ya!Hello! how is this? %s\n"[a]), &("junk/super"[b]));
    

    或者去掉 a=3 和 b=5

       printf("Hello! how is this? %s\n", "super");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多