服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - 编程技术 - 关于C编程语言,几乎没有人知道的事

关于C编程语言,几乎没有人知道的事

2020-10-11 23:02今日头条编程重度爱好者 编程技术

首先话不多说,直接给您去介绍咯。在C语言中,您可以在类型转换中,运算符内部,函数声明中声明新类型。sizeof

首先话不多说,直接给您去介绍咯。

关于C编程语言,几乎没有人知道的事

在C语言中,您可以在类型转换中,运算符内部,函数声明中声明新类型。sizeof

  1. int a = sizeof(enum E { A, B, C }) + (enum X { D, E, F }) 0;  
  2. enum E e = B;  
  3. int b = e + F;  

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

  1. for (int i = 0; i < 10; ++i)  
  2. {   int i = 42; // <-C语言中的OK,声明其他局部变量  
  3. }  

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

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

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

  1. const const const const int i = 42; 

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

  1. int i;  
  2. int i;  
  3. int i, i, i, i;  

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

  1. int *p = 0;  
  2. double *pd = p; //<-在C中不允许 
  3. char *pc = 123;// <-在C中不允许 

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

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

  1. int i = 0;  
  2.   sizeof(int [++ i]); //运行时`sizeof`将使`i`递增  
  3.    int a [20];  
  4.   sizeof(a [++ i]); //编译时`sizeof`不会使`i`递增  

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

  1. goto skip;  
  2.  int n = 42;  
  3. typedef int A[n];  
  4.  skip:;  

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

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

  1. int a;  
  2. 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[]通常是“等效的”,后一种形式仍要求数组元素类型完整,而前一种则不需要

  1. struct Incomplete;  
  2. void foo(struct Incomplete *array);  
  3. void bar(struct Incomplete array[]); 

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

  1. void foo(int *const array); 

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

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

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

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

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

  1. void foo(int array [static 5]);   
  2. //从类型上讲,它仍然等效于`int array []`  
  3. //但是编译器会提示  

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

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

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

  1. extern void v; 

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

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

  1. // 此时未声明“ struct S”类型 
  2. void foo(struct S *p);  
  3. void foo(struct S *p)  
  4. {  
  5. }  

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

延伸 · 阅读

精彩推荐
  • 编程技术从Context源码实现谈React性能优化

    从Context源码实现谈React性能优化

    这篇文章主要介绍Context的实现原理,源码层面掌握React组件的render时机,从而写出高性能的React组件,源码层面了解shouldComponentUpdate、React.memo、PureComponen...

    魔术师卡颂5312020-12-20
  • 编程技术真正聪明的程序员,总有办法不加班

    真正聪明的程序员,总有办法不加班

    工作效率提升了,就可以少加班了,聪明的程序员,总会有一堆可以提升编码效率的工具?当一种工具满足不了工作需求,就去探索新的,今天纬小创就给...

    今日头条12482021-03-04
  • 编程技术2021年值得关注的React PDF 库

    2021年值得关注的React PDF 库

    今天,许多网络应用程序为其用户提供内置的PDF浏览选项。然而,选择一个并不容易,因为它们的功能远远超过显示PDF。在这篇文章中,我将评估5个React的...

    TianTianUp5222021-06-21
  • 编程技术让开发效率倍增的 VS Code 插件

    让开发效率倍增的 VS Code 插件

    今天来分享一些提升开发效率的实用 VS Code 插件!Better Comments 扩展可以帮助我们在代码中创建更人性化的注释,有不同形式和颜色的注释供我们选择。 ...

    前端充电宝7132022-04-21
  • 编程技术Delphi - Indy idMessage和idSMTP实现邮件的发送

    Delphi - Indy idMessage和idSMTP实现邮件的发送

    这篇文章主要介绍了Delphi - Indy idMessage和idSMTP实现邮件的发送,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...

    JJ_JeremyWu6592020-09-22
  • 编程技术简单、好懂的Svelte实现原理

    简单、好懂的Svelte实现原理

    本文会围绕一张流程图和两个Demo讲解,正确的食用方式是用电脑打开本文,跟着流程图、Demo一边看、一边敲、一边学...

    魔术师卡颂4822021-11-10
  • 编程技术AIOps,SRE工程师手中的利器

    AIOps,SRE工程师手中的利器

    AIOps开始成为一种极为重要的站点可靠性工程工具。它能够高效吸纳观察数据、参与数据以及来自第三方工具的数据,判断系统运行状态并保证其处于最佳...

    至顶网5962021-03-08
  • 编程技术用户态 Tcpdump 如何实现抓到内核网络包的?

    用户态 Tcpdump 如何实现抓到内核网络包的?

    在网络包的发送和接收过程中,绝大部分的工作都是在内核态完成的。那么问题来了,我们常用的运行在用户态的程序 tcpdump 是那如何实现抓到内核态的包...

    开发内功修炼11612021-09-08