无法确定输出c代码的原因

时间:2015-04-04 16:10:54

标签: c

我有以下代码。我无法确定它给出的输出的原因。

char abc[14] = "C Programming";

printf("%s\n", abc+abc[3]-abc[4]);

输出:在AGC

这是一个测验问题,有以下选项:这会打印什么? a)C编程b)rogamming c)运行时错误d)编译错误

4 个答案:

答案 0 :(得分:2)

如果我放入踏脚石v3v4,也许会更清楚。这些用于计算3个索引的字符串的偏移量。因此,打印输出从abc[3]开始。

#include <stdlib.h>
#include <stdio.h>

int main (int argc, char *argv[])
{
    char abc[14] = "C Programming";
    int v3 = abc[3];
    int v4 = abc[4];
    printf("%d - %d = %d\n", v3, v4, v3 - v4);
    printf("%s\n", abc + v3 - v4);
    return 0;
}

节目输出:

114 - 111 = 3
rogramming

答案 1 :(得分:2)

这可能是由以下原因造成的: abc[3]的值为&#39; r&#39;,abc[4]的值为&#39; o&#39;。的值为

abc[3]-abc[4]

是&#39; - &#39; o&#39;,将值更改为int 3。所以当您使用printf("%s\n", abc+abc[3]-abc[4]);时,就意味着你从abc打印这个字符串[3]。 以下代码将向您展示。

 int main()
  {
  char abc[14] = "C Programming";
  printf("%d\n",abc[3]-abc[4]);
  printf("%s\n", abc+abc[3]-abc[4]);

  }

答案 2 :(得分:2)

在这个表达式abc+abc[3]-abc[4]中,使用了所谓的指针算法。

表达式中的数组名称将转换为指向数组第一个元素的指针

因此,在上面的表达式中,abc指向'C' abc + 1指向空格的字符串的第一个字符。 abc + 2指向&#39; P&#39;。 abc + 3指向&#39; r&#39;等等。

表达式abc [3]和abc [4]转换为int类型并等于内部代码'r''o'这些代码的差异等于3,

因此,表达式abc+abc[3]-abc[4]可以像abc + 3一样编写,并指向数组的第四个元素'r'所以字符串从&#39; r&#39;开始。被声明

输出
printf("%s\n", abc+abc[3]-abc[4]);

答案 3 :(得分:1)

几乎在每个平台上(例如使用ASCII的平台),行为都是未定义的。所以,没有一个答案是正确的。

abc+abc[3]-abc[4]

此表达式等于

abc + 'r' - 'o'

字符常量的值是依赖于实现的;假设一个ASCII系统,其中ro分别是0x6f和0x72,abc + 0x6f超出了数组abc的范围,导致未定义的行为。注意,后来的减法,似乎将结果带回界限,并没有改变它;一旦达到,就无法从未定义的行为中恢复过来。

也就是说,结果可能与abc + ('r' - 'o')相同,abc + (0x6f - 0x72)在ASCII系统上为abc + 3,而rogramming则为{{1}},因而{{1}}如问题中所报告的那样输出。