我是编程和学习python动态类型的新手,这引起了对“静态类型”的怀疑。我试用了这段代码(将字符串分配给先前声明的整数变量),然后将变量打印为printf(var_name)
并给出输出;谁能解释这个概念?
#include<stdio.h>
#include<conio.h>
void main()
{
int i = 20 ;
i = "hello";
printf(i);
}
答案 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),这意味着它可能在您的计算机上正常工作,但在我身上坠毁。