为什么在C语言中,下面代码中提到的警告行会占用下一行';什么是字符串和打印? #包括 #包括 int main() { printf(“你好,世界!\n”); printf(“a”+14); printf(“tera kya hoga kalia\n\n”); 返回0; }

为什么在C语言中,下面代码中提到的警告行会占用下一行';什么是字符串和打印? #包括 #包括 int main() { printf(“你好,世界!\n”); printf(“a”+14); printf(“tera kya hoga kalia\n\n”); 返回0; },c,printf,C,Printf,//此代码打印 你好,世界 卡利亚 tera kya hoga kalia //为什么它需要下一行的打印数据 //是的,C是新来的 线路: #include <stdio.h> #include <stdlib.h> int main() { printf("Hello world!\n"); printf("a"+14); printf("tera kya hoga kalia \n\n"); return 0; } 相当于: p

//此代码打印

你好,世界

卡利亚

tera kya hoga kalia

//为什么它需要下一行的打印数据

//是的,C是新来的

线路:

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

int main()
{
    printf("Hello world!\n");
    printf("a"+14);

    printf("tera kya hoga kalia \n\n");

    return 0;
}
相当于:

printf("a"+14);
表达式
s1+14
的计算结果为无效指针。给定
s1
的值,只有
s1+0
s1+1
是有效的指针

由于
s2
是无效指针,因此该行

char const* s1 = "a";
char const* s2 = s1 + 14;
printf(s2);
是未定义行为的原因

事实上,给定
s1
的值,对于所有
i<0
i>2
而言,仅计算
s1+i
是未定义的行为

根据EOF的评论:

6.5.6加法运算符8[…]如果指针操作数和结果都指向同一数组对象的元素,或超过数组对象最后一个元素的元素,则计算不应产生溢出;否则,行为是未定义的


计算超出对象边界的指针算术的未定义行为。C11标准草案n1570 6.5.6加法运算符8[…]如果指针操作数和结果都指向同一数组对象的元素,或超过数组对象最后一个元素的元素,则计算不应产生溢出;否则,行为是未定义的。未定义的行为从加法开始。您不需要
printf()
具有未定义的行为。
printf(s2);