当我在printf()中的字符串后面添加带加号的int时会发生什么

我已经在混淆程序中读了下面的代码。

我想知道为什么编译器在我这样做时给了我一个警告而不是一个错误。 代码真正想做什么以及为什么编译器建议我使用数组?

#include  int main() { int f = 1; printf("hello"+!f); return 0; } warning: adding 'int' to a string does not append to the string [-Wstring-plus-int] printf("hello"+!f); ~~~~~~~^~~ note: use array indexing to silence this warning printf("hello"+!f); ^ & [ ] 

考虑语句printf("hello");

该语句将字符串文字"hello"发送到printf(); function。


现在让我们分别考虑代码

 char* a = "hello"; 

这将指向存储字符串文字"hello"的地址。

如果一个人怎么办

 char* a = "hello" + 1; 

它将指向存储"ello"的地址。 "hello" + 1地址,指向字符串文字"ello"


将此应用于您的代码

 printf("hello"+!f); 

f值为1!f值为0 。 因此,最终它将指向字符串文字"hello" + 0 ,即"hello" 。 然后将其传递给printf()


您没有收到错误,因为它不是错误。

 printf("hello"+!f); 

实际上是做什么的; 首先将!f的值添加到字符串“hello”的地址中(因此不是值hello,而是指向值)。

这是否有意义取决于!f的值。 如果它小于该字符串的长度,您将获得指向字符串中间某处的指针。 如果它大于字符串的长度,它将指向字符串外部,并且尝试访问它将导致未定义的行为(最好是崩溃;最坏的情况是,程序中其他地方的意外行为)。

因为在你的情况下!f只是0,它只输出字符串“hello”。

许多编程语言使用plus运算符来连接字符串,例如"Hello" + " world" 。 通常整数会以静默方式转换为字符串,因此"num=" + num可能会按预期工作。 C是不同的。

正如Haris完美解释的那样,您的代码没有错。 所以没有理由发出错误。

但是你的编译器会引起关注,不管你是否真正意味着你所写的内容。 谷歌会说:你正在向printf()发送"hello" / "ello" 。 你是说"hello0" / "hello1"吗?