c - 输出相同但条件 a[3] 和 3[a] 不同

标签 c

<分区>

char a[10] = "pqrstuvwxyz";
printf("%s", a[3]);
printf("%s", 3[a]);

printf 都给出相同的输出。为什么?

这肯定与 C 编译器在内存中表示字符串的方式有关,但它是什么?

我本以为偏移量乘以 char 的大小,在这种情况下它们应该给出不同的输出。

最佳答案

因为那些是等价的表达。索引相当于指针运算。

int x[10];
int y = x[1];
// same as (and is converted by the compiler to)...
int y = *(x + 1);

因为加法是可交换的,所以它也等同于...

int y = *(1 + x);

还有……

int y = 1[x];

附带说明一下,您正在通过使用 %s 格式说明符并传入 char 来调用未定义的行为。 %s 需要一个以空字符结尾的字符串,即指向以空字符结尾的 char 的指针。注意您的警告。

如果要打印该数组中的子字符串,请使用:

printf("%s", a + 3);
// or
printf("%s", &a[3]);

关于c - 输出相同但条件 a[3] 和 3[a] 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16163786/

相关文章:

c - 为什么retarget.o归档到静态库中时,retarget.c中的 "_write"等函数没有链接?

java - C 和 Java 中的后缀和前缀运算符产生不同的结果

c - for 循环变量溢出时的行为和编译器优化

在生产环境中捕捉返回码?

c - 拆分一个字符串并打印出每个单词

c - 包含所有 equals 语句的 for 循环 C

c++ - 分配过大的堆栈结构是未定义的行为吗?

c - 如何修复 '=' 标记|之前的编译器错误 : expected ',' , ';' 、 'asm' 、 'attribute' 或 '{' ?

c - 如何重用数组以非常快地写入 C 中的大文件

c - 为什么用 622080000 替换 622.08E6 时我的代码不起作用?