C语言编程学习之如何在类型转换中,运算符内部,函数声明中声明新类型
小职 2020-10-12 来源 : 阅读 1017 评论 0

摘要:本篇介绍了在C语言学习中,如何在类型转换中,运算符内部,函数声明中声明新类型,希望对C语言的学习有所帮助,也对C语言有更深入的了解。

本篇介绍了在C语言学习中,如何在类型转换中,运算符内部,函数声明中声明新类型,希望对C语言的学习有所帮助,也对C语言有更深入的了解。

 C语言编程学习之如何在类型转换中,运算符内部,函数声明中声明新类型

int a = sizeof(enum E { A, B, C }) + (enum X { D, E, F }) 0;  

enum E e = B;  

int b = e + F;  

在C循环中,“头”和循环体是两个单独的(嵌套的)作用域

 

for (int i = 0; i < 10; ++i)  

{   int i = 42; // <-C语言中的OK,声明其他局部变量  

}  

这不同于C ++,后者两者都形成一个范围。

 

可以在C中进行[递归]调用main

 

在C语言中,可以在声明中显式地重复cv限定词

 

const const const const int i = 42;

在C中,您可以在相同的翻译单元中一次又一次地定义相同的文件作用域对象,只要这些定义仍然是暂定的即可(不要多次包含初始化器)

 

int i;  

int i;  

int i, i, i, i;  

与流行的看法相反,C不支持不同指针类型之间以及整数和指针类型之间的隐式转换

 

int *p = 0;  

double *pd = p; //<-在C中不允许

char *pc = 123;// <-在C中不允许

但是支持隐式的指针往返转换void *。

 

将运算符应用于可变修改后的类型时,将sizeof在运行时对其进行评估

 

int i = 0;  

  sizeof(int [++ i]); //运行时`sizeof`将使`i`递增  

   int a [20];  

  sizeof(a [++ i]); //编译时`sizeof`不会使`i`递增  

typedef用C -declaration实际上可以生成可执行代码,如果声明为可变类型(一个VLA)。因此,绕过该声明进入该声明的范围是非法的typedef

 

goto skip;  

 int n = 42;  

typedef int A[n];  

 skip:;  

即使main应该声明为返回int,也不需要显式地return从中进行任何操作int main()。如果控制从末尾流出main,则其行为就像return 0;

 

运算符sizeof有两种独立的语法:一种用于类型,另一种用于表达式。后者没有()围绕其论点

 

int a;  

sizeof a; // 不需要在`a`附近使用`()`

从C99语句(如if,等)开始for,while创建自己的隐式块。在C99块之前,仅由的显式对创建{}。

 

标准C从未允许人们在声明中完全省略decl-specifier-seq 。即使在具有“隐式int”规则的C89 / 90中,也无法将函数声明为foo()。你可以做extern foo()或者const foo(),例如,而不是只foo()。

 

带空的函数声明()是K&R样式的声明。不建议使用K&R样式的声明。如果您的函数没有参数,则将其声明为(void),而不是()。

 

函数声明和函数原型不是一回事。在现代C语言中,需要使用函数声明。但是功能原型不是。

 

即使在函数参数列表中,诸如int *array和的声明int array[]通常是“等效的”,后一种形式仍要求数组元素类型完整,而前一种则不需要

 

struct Incomplete;  

void foo(struct Incomplete *array);  

void bar(struct Incomplete array[]);

在函数参数列表中声明指针时,可以将指针本身声明为 const

 

void foo(int *const array);

在C89 / 90中,使用参数声明的“等效”数组形式时,以前不可能声明相同类型的常数。但是,由于C99,可以通过const在[]

 

void bar(int array[const]); // 与ʻint * const array`相同

使用函数参数声明的数组形式时,数组的大小通常无关紧要

 

void foo(int array[5]); //等同于`int array []`。`5`被忽略。

但是,当size带有关键字时,static它充当编译器的提示。它说实际的数组至少会那么大。它可能/将改善编译器优化

 

void foo(int array [static 5]);   

//从类型上讲,它仍然等效于`int array []`  

//但是编译器会提示  

声明为的位字段int不一定是带符号的。这是C语言中的一个上下文,其中plainint不一定与相同signed int。一个int位字段可能被符号或无符号-这个行为应该是实现定义的。因此,始终明确指定您的意图始终是一个好习惯:将位字段明确声明为signedor unsigned,而不是简单声明int。

 

do … while是唯一以。结尾的迭代语句形式;。

 

在C语言中可以对类型为Object的对象进行非定义声明 void

 

extern void v;

但是,由于类型不完整,因此无法为该声明提供匹配的定义void。

 

函数参数列表中提到的未知结构类型被视为新类型的声明。但是,此类型的范围仅限于该函数声明。同一功能的下一个声明将不可见或不知道它。例如,以下声明序列乍一看“看起来不错”,但实际上是无效的

 

// 此时未声明“ struct S”类型

void foo(struct S *p);  

void foo(struct S *p)  

{  

}  

struct S第一个声明提到的类型是原型的局部变量,与第二个声明完全无关struct S。因此,这些函数声明是冲突的。



关注“职坐标在线”公众号,免费获取最新技术干货教程资源哦!

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程