将字符串分配给int类型的变量

时间:2011-11-21 05:36:38

标签: c

为什么我可以将字符串赋给int类型的变量?例如。以下代码正确编译:

int main(int argv, char** argc){
    int a="Hello World";
    printf(a);
}

此外,当我将字符串分配给不同类型的变量(即double和char)时,程序不会编译。

我认为实际发生的是编译器执行int* a = "Hello World";,当我写double a="Hello World";时,它会按原样执行该行代码。

这是对的吗?

5 个答案:

答案 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上,将字符串分配给intunsigned long longchar都会产生警告,而不是错误。

坦率地说,这不是依赖的行为。更不用说,printf(a);也是printf的危险用途。