我有以下代码。我无法确定它给出的输出的原因。
char abc[14] = "C Programming";
printf("%s\n", abc+abc[3]-abc[4]);
输出:在AGC
这是一个测验问题,有以下选项:这会打印什么? a)C编程b)rogamming c)运行时错误d)编译错误
答案 0 :(得分:2)
如果我放入踏脚石v3
和v4
,也许会更清楚。这些用于计算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系统,其中r
和o
分别是0x6f和0x72,abc + 0x6f
超出了数组abc
的范围,导致未定义的行为。注意,后来的减法,似乎将结果带回界限,并没有改变它;一旦达到,就无法从未定义的行为中恢复过来。
也就是说,结果可能与abc + ('r' - 'o')
相同,abc + (0x6f - 0x72)
在ASCII系统上为abc + 3
,而rogramming
则为{{1}},因而{{1}}如问题中所报告的那样输出。