首先我就不多说了,直接给大家介绍一下。在C语言中,您可以在强制转换、运算符内部、函数声明中声明新类型。sizeofinta=sizeof(enumE{A,B,C})+(enumX{D,E,F})0;enumEe=B;intb=e+F;在C循环中,“循环头”和循环体是两个独立的(嵌套的)作用域for(inti=0;i<10;++i){inti=42;//<-C中OK,声明其他局部变量}这和C++不同,后者都是一个范围。可以在C中对main进行[递归]调用在C中,您可以在声明中显式重复cv限定符constconstconstconstinti=42;在C中,您可以在同一个翻译单元中一次又一次地定义同一个文件Scoped对象,只要这些定义仍然是暂定的(不要多次包含初始值设定项)inti;inti;inti,i,i,i;与流行的看法相反,C不支持不同指针类型和整数之间的隐式转换指针类型之间的隐式转换int*p=0;double*pd=p;//<-C中不允许char*pc=123;//<-C中不允许,但支持指向和来自void*的隐式指针。当运算符应用于可变修改类型时,sizeof在运行时计算inti=0;sizeof(int[++i]);//`sizeof`在运行时会递增`i`inta[20];sizeof(a[++i]);//`sizeof`在编译时不会使`i`递增typedef实际上可以生成带有C声明的可执行代码,如果它被声明为变量类型(aVLA)。因此绕过声明进入声明范围是非法的typedefgotoskip;intn=42;typedefintA[n];skip:;即使main应该被声明为返回int,也没有必要明确地从intmain()中返回任何东西。如果控制在最后流出main,它的行为类似于return0;运算符sizeof有两种不同的语法:一种用于类型,一种用于表达式。后者在其论点周围没有();大小;//无需在C99语句(如if等)的`a`周围使用`()`,同时创建它们自己的隐式块。在C99块之前,只创建显式的{}对。标准C从来不允许在声明中完全省略decl-specifier-seq。即使在具有“隐式int”规则的C89/90中,也不可能将函数声明为foo()。例如,您可以执行externfoo()或constfoo()而不仅仅是foo()。带有empty()的函数声明是K&R样式声明。K&R样式的语句已弃用。如果您的函数没有参数,请将其声明为(void),而不是()。函数声明和函数原型不是一回事。在现代C中,函数声明是必需的。但是函数原型不是。即使在函数参数列表中,int*array和intarray[]等声明通常是“等价的”,但后一种形式仍然要求数组元素类型完整,而前者则不需要structIncomplete;voidfoo(structIncomplete*数组);voidbar(structIncompleteearray[]);在函数参数列表中声明指针时,指针本身可以声明为constvoidfoo(int*constarray);在C89/90中,当使用“等价”数组形式的参数声明时,以前不能声明相同类型的常量。但是,从C99开始,可以在[]voidbar(intarray[const]);//同`int*constarray`中传递const当使用函数参数声明的数组形式时,数组的大小通常无关紧要voidfoo(intarray[5]);//等同于`intarray[]`。`5`被忽略。但是,当size具有关键字static时,它会作为对编译器的提示。它说实际数组至少有那么大。它可能/将改进编译器以优化voidfoo(intarray[static5]);//按类型,它仍然等同于`intarray[]`//但编译器会提示声明为int的位域不一定是符号位域。这是C中的上下文,其中plainint不一定与signedint相同。一个int位字段可以是有符号的或无符号的——这种行为应该是实现定义的。因此,明确指定您的意图始终是一个好习惯:明确地将位字段声明为有符号或无符号,而不是简单地声明int。do...while是唯一一个带有.迭代语句以;形式结束。在C中可以为Object类型的对象进行非定义声明voidexternvoidv;但是,由于类型不完整,无法为声明提供匹配的定义void。函数参数列表中提及的未知结构类型被视为新类型的声明。但是,这种类型的范围仅限于函数声明。同一函数的下一个声明将不可见或察觉不到。比如下面的声明序列,乍看之下“看起来不错”,实际上是无效的//此时没有声明“structS”类型voidfoo(structS*p);voidfoo(structS*p){}structSfirst声明中提到的类型是原型的局部变量,与structS的第二次声明完全没有关系。因此,这些函数声明是冲突的。
