我已经在混淆的程序中阅读了下面的代码。
我想知道为什么编译器在我这样做时给了我一个警告而不是错误。代码真正想做什么以及为什么编译器建议我使用数组?
#include <stdio.h>
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);
^
& [ ]
答案 0 :(得分:7)
考虑语句printf("hello");
此语句将字符串文字"hello"
发送到printf();
函数。
现在让我们单独考虑代码
char* a = "hello";
这将指向存储字符串文字"hello"
的地址。
如果有人怎么办
char* a = "hello" + 1;
它会使a
指向存储"ello"
的地址。 "hello" + 1
的地址,指向字符串文字"ello"
将此应用于您的代码
printf("hello"+!f);
f
的值为1
。 !f
的值为0
。因此,最终它将指向字符串文字"hello" + 0
的地址,即"hello"
。然后将其传递给printf()
。
您没有收到错误,因为它不是错误。
答案 1 :(得分:1)
printf("hello"+!f);
它实际上在做什么;首先将!f
的值添加到字符串“hello”的地址中(因此不是值hello,而是添加到指针值)。
这是否有意义取决于!f
的价值。如果它小于该字符串的长度,您将获得一个指向字符串中间某处的指针。如果它大于字符串的长度,它将指向字符串外部,并且尝试访问它将导致未定义的行为(最好是崩溃;最坏的情况是,程序中其他地方的意外行为)。
因为在你的情况下!f
只是0,它只输出字符串“hello”。
答案 2 :(得分:0)
许多编程语言使用plus运算符来连接字符串,例如"Hello" + " world"
。通常整数会以静默方式转换为字符串,因此"num=" + num
可能会按预期工作。 C是不同的。
正如Haris完美解释的那样,你的代码并没有错。所以没有理由发出错误。
但是你的编译器引起了人们的担忧,不管你是否真正意味着你所写的内容。 Google会说:您正在向printf()发送"hello"
/ "ello"
。您的意思是"hello0"
/ "hello1"
吗?