为先前声明为“ int”的变量分配“字符串”

时间:2019-01-18 14:03:00

标签: c

我是编程和学习python动态类型的新手,这引起了对“静态类型”的怀疑。我试用了这段代码(将字符串分配给先前声明的整数变量),然后将变量打印为printf(var_name)并给出输出;谁能解释这个概念?

#include<stdio.h>
#include<conio.h>
void main()
{
    int i = 20 ;
    i = "hello";
    printf(i);
}

1 个答案:

答案 0 :(得分:4)

除了您的问题可能是重复的问题之外,我还附上一些缺失的有价值的答案https://stackoverflow.com/a/430414/3537677

C是强/静态类型,但检查不严格

这是最大的核心语言功能之一,它使C与其他语言(例如C ++)脱颖而出。 (哪些人习惯将简单的“带有类的C”误认为是

意思是,尽管C在需要并在编译时知道类型大小的情况下具有强大的类型系统,但C语言没有类型系统来检查它们是否被滥用。因此,编译器既无权检查它,也无权使您的代码出错,因为它是合法的C代码。现代编译器会发出警告。

C编译器仅确保上述大小管理的“其类型系统”。意思是,如果您仅键入int i = 42;,则此变量具有所谓的自动存储持续时间,或者多少人正确地或多或少正确地称呼“堆栈”。这意味着编译器将为变量保留空间并对其进行清理。如果它不知道它的大小,但是需要它,那么它的确会产生错误。但这可以通过在运行时执行操作并使用没有任何类型的类型的类型(即指针和void*无效指针)来避免。

关于您的代码

根据#include<conio.h>void返回的main判断,您的代码似乎是旧的非标准C编译器。进行一些修改就可以编译您的代码,但是通过使用非法的格式字符串调用printf,您会导致所谓的 undefined behaviour (UB),这意味着它可能在您的计算机上正常工作,但在我身上坠毁。

相关问题