为什么我可以将字符串赋给int类型的变量?例如。以下代码正确编译:
int main(int argv, char** argc){
int a="Hello World";
printf(a);
}
此外,当我将字符串分配给不同类型的变量(即double和char)时,程序不会编译。
我认为实际发生的是编译器执行int* a = "Hello World";
,当我写double a="Hello World";
时,它会按原样执行该行代码。
这是对的吗?
答案 0 :(得分:2)
实际上,该赋值是违反约束的,需要从任何符合要求的C实现中进行诊断(可能只是警告)。 C语言标准没有定义程序的行为。
编辑:约束在C99 standard的6.5.16.1节中,该节描述了简单赋值的允许操作数。较旧的C90标准具有基本相同的规则。预ANSI-C(如K& R1中所述,1978年出版)确实允许这种特殊的隐式转换,但自1989年版本的语言以来它一直无效。
如果它编译的话可能会发生什么
int a="Hello World";
如果是,将被视为
int a = (int)"Hello World";
强制转换采用指针值并转换为int。这种转换的意义是实现定义的;如果char*
和int
的大小不同,则可能会丢失信息。
某些转换可以明确地完成,例如在不同的算术类型之间。这可能不是。
你的编译器 应该抱怨这个。提高警告级别直到达到警告级别。 (告诉我们你正在使用什么编译器,我们可以告诉你如何做到这一点。)
编辑:
printf
来电:
printf(a);
在C90中有未定义的行为,并且是一个约束违规,需要在C99中进行诊断,因为你正在调用一个没有可见原型的可变参数函数。如果您想致电printf
,必须
#include <stdio.h>
(在某些情况下,编译器不会告诉你这个,但它仍然是不正确的。)并且给出了一个可见的声明,因为printf
的第一个参数是类型char*
而你正在传递int
。
如果您的编译器没有抱怨
double a="Hello World";
你应该得到一个更好的编译器。那(可能)尝试将指针值转换为double
类型,这根本没有任何意义。
答案 1 :(得分:1)
"Hello World"
是一个以char '\0'
将值分配给int a
时,将数组中第一个字符的地址指定给a
。海湾合作委员会正试图善待你。
当你打印它时,它会转到a
指向的位置并打印所有字符,直到它到达char '\0'
。
答案 2 :(得分:0)
它将编译,因为(在32位系统上)int,int *和char *都对应于32位寄存器 - 但是double是64位而char是8位。
答案 3 :(得分:0)
编译时,我收到以下警告:
[11:40pm][wlynch@wlynch /tmp] gcc -Wall foo.c -o foo
foo.c: In function ‘main’:
foo.c:4: warning: initialization makes integer from pointer without a cast
foo.c:5: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast
foo.c:5: warning: format not a string literal and no format arguments
foo.c:5: warning: format not a string literal and no format arguments
foo.c:6: warning: control reaches end of non-void function
从警告中可以看出,"Hello World"
是一个指针,它会自动转换为整数。
但是,您提供的代码并不总能正常工作。指针有时大于int。如果是,你可能会得到一个截断的指针,然后当你尝试使用该值时会出现一个非常奇怪的错误。
答案 4 :(得分:0)
它会对GCC和clang等编译器发出警告。
warning: initialization makes integer from pointer without a cast [enabled by default]
字符串文字"Hello World"
是const char *
,因此您要指定一个指向int
的指针(即将字符串中第一个字符的地址转换为int
}值)。在我的编译器,gcc 4.6.2和clang-mac-lion上,将字符串分配给int
,unsigned long long
或char
都会产生警告,而不是错误。
坦率地说,这不是依赖的行为。更不用说,printf(a);
也是printf
的危险用途。