为什么在C语言中,下面代码中提到的警告行会占用下一行';什么是字符串和打印? #包括 #包括 int main() { printf(“你好,世界!\n”); printf(“a”+14); printf(“tera kya hoga kalia\n\n”); 返回0; }
//此代码打印 你好,世界 卡利亚 tera kya hoga kalia //为什么它需要下一行的打印数据 //是的,C是新来的 线路:为什么在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
#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);