C语言——关键字

C语言——关键字


宗旨:技术的学习是有限的,分享的精神是无限的。


【谨记:尽量不要用printf函数,要去看变量的值,内存的值。】

 autointdoublelongcharfloatshortsignedunsignedstructunionenumstaticswitchcasedefaultbreakregisterconstvolatiletypedefexternreturnvoidcontinuedowhileifelseforgotosizeof

【定义和声明:定义创建了对象并为这个对象分配了内存,声明没有分配内存。】 

auto                //声明自动变量,缺省时编译器一般默认为auto
int                 //
声明整型变量 
double             //
声明双精度变量
long               //
声明长整型变量 
char               //
声明字符变量
float               //
声明浮点型变量 
short               //
声明短整型变量
signed             //
声明有符号类型变量
unsigned           //
声明无符号类型变量 
struct              //
声明结构体变量
union              //
声明联合类型数据
enum              //
声明枚举类型
static              //
声明静态变量   
switch             //
用于开关语句   
case              //
开关语句分支
default            //
开关语句中的其他分支 
break             //
跳出当前循环
register           //
声明寄存器变量 
const             //
声明只读变量   
volatile           //
说明变量在程序执行中可被隐含地改变
typedef           //
用以给数据类型取别名
extern            //
声明变量是在其他文件正声明(也可以看做是引用变量)
return            //
子程序返回语句(可以带参数,也可不带参数)
void             //
声明函数无返回值或无参数,声明空类型指针
continue         //
结束当前循环,开始下一轮循环  
do              //
循环语句的循环体  
while            //
循环语句的循环条件
if               //
条件语句
else             //
条件语句否定分支(if连用
for              //
一种循环语句
goto            //
无条件跳转语句,尽量少用或者不用
sizeof           //
计算对象所占内存空间大小,这不是个函数   

我在这儿只说一些比较常用而且比较重要的关键字

 

1. register

请求编译器尽可能的将变量存到CPU内部寄存器中而不是通过内存寻址访问以提高效率。。对这种变量不可以使用取址运算符来获取其地址,因为它不再内存中。寄存器变量用的不算多,但是还是得知道是什么意思。 


2. static--- 修饰变量和函数(限定作用域)

1.修饰变量

//变量又分为局部和全局变量,但它们都存在于内存的静态区。
//静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使用extern声明也没法使用。
准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的代码行也不可以使用。
//静态局部变量,在函数体里面定义的,就只能在这个函数里用,同一个文档中的其他函数也用不了。
由于被static修饰的变量松狮存在内存的静态区,所以即使这个函数运行结束,
这个静态变量的值还是不会被销毁,函数下次使用时仍然能用。

2.修饰函数

//函数前加static使得函数成为静态函数。
但此处static的含义不是指存储方式,而使指对函数的作用域仅局限于本文件(所以又称内部函数)。
使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其他文件的函数同名。

//在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。
//随后,static在C中有了第二种含义:用来表示不能被其他文件访问的全局变量和函数。
为了避免引入新的关键字,所以仍然使用static关键字来表示这第二种含义。

 

3. 基本数据类型:shortlongintcharfloatdouble(共6种)

构造数据类型:数组、结构体struct、公用体union、枚举类型enum

空类型void

【short为2个字节,int为4个字节,long为4个字节,float为4个字节、

 double为8个字节,char为1个字节(一般情况下)】

【隐式类型转换:short,char → int →unsigned  int → long → double(主干道) ←float】

 

4. sizeof关键字计算变量所占空间 – 数组做函数参数时,退化为指针,4字节

  sizeof (int)*p  -----  sizeof(int) * p = 4p

  再次强调,sizeof不是函数,而是关键字。

 

5. signedunsigned关键字:

//32位的signedint类型整数其值表示范围为:-2^31~2^31-1
//8位的signed char类型其值表示范围为:-2^7~2^7-1
//32位的unsigned int类型整数其值表示范围为:0~2^32-1
//8位的unsigned char类型其值表示范围为:0~2^8-1

  在计算机中,数值是以补码的形式存储:使用补码,可以将符号位与其他位统一处理,同时减法也可以按加法处理。

 

6. ifelse关键字:

写if语句时,一般情况下先处理正常情况再处理异常情况,以便提高效率,可读性也较好;bool一般初始化为false比较好;int,float,指针变量 与0的比较问题(整形可以直接与0比较;float是实型,不能精确到0;指针变量与NULL)

if(flag) --- bool

if(0 == i) --- int

if(i > -0.000001 && i <0.000001)  --- float

if(NULL == p) --- 指针变量

 

7. switch/case关键字:【解决多分支的问题】

  每个case语句结尾加break;最后必须使用default分支。

case后面只能是整形或者字符型的常量或常量表达式。

 

8. do/while/for关键字:(3种循环结构)

while:先判断while后面括号里的值,如果为真则执行其后面的代码;否则不执行
do-while:先执行do后面的代码,然后再判断while后面括号里的值,如果为真,循环开始;否则,循环不开始。用法和while没有区别,但相对较少用。---  至少执行一次
for:可以很容易的控制循环次数,多用于事先知道循环次数的情况。

【多重循环时,最长的循环放在最内层,最短的放在最外层,以提高执行效率;循环不要超过3层嵌套】

 

9. break终止本层循环;continue终止本次循环,开始下一次循环;return终止函数。

 

10. void关键字:空即是色”--- 很强大

 --- 函数返回值的限定;函数参数的限定。

任何指针类型都可以直接赋给void *类型,反过来就不行;不能定义一个void变量。

//void *memcpy(void *dest, const void *src, size_tlen);

//void *memset(void *buffer, int c, size_t num);

能说的比较少,但是void关键字真的是很强大,这点毋庸置疑。

 

11. return关键字:

  --- 终止一个函数并返回其后跟的值

  【别返回栈内存的的指针,因为该内存在函数体结束时被自动销毁,会导致程序错误】

 

12. const关键字: ---- 不是常量,而是只读变量;用得好的话大大提高程序的效率

const修饰的是只读的变量,其值在编译时不能被使用,因为编译器在编译时不知道其存储的内容。
const推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。

const和define的区别:const修饰的只读变量,并且在定义的同时进行初始化;const可以节省空间,避免不必要的内存分配,同时提高效率;修饰一般变量,一般变量是指简单类型的只读变量;修饰数组;修饰指针;修饰函数的参数,当不希望这个参数值被函数体内意外改变时使用;修饰函数的返回值,表示返回值不可被改变;在另一连接文件中引用const只读变量。

【编译器通常不为普通const只读变量分配存储空间,而使将它们保存在符号表中,这使得它成为一个编译器件的值,没有了存储与读内存的操作,使得它的效率也很高;const定义的只读变量从汇编的角度看,只是给出了对应的内存地址,而不是像define一样给出的立即数】

const M = 3;  int a[M]; --- 错误的,数组里面不能是变量,即使是只读

#define M 3   int a[M]; --- 正确的,预处理的时候做宏替换

const int *p;//p可变,p指向的对象不可变

int const *p;//p可变,p指向的对象不可变

int *const p;//p不可变,p指向的对象可变

const int *const p;//指针p和p指向的对象都不可变

 

13. volatile关键字: --- 判别普通工程师和嵌入式工程师

  防止编译器优化,做嵌入式这行的不认识这个关键字,就要回家多修炼修炼啦!

 

14. extern关键字:

extern修饰变量或者函数,以表示变量或者函数的定义在别的文件中。从而提示编译器遇到此变量和函数时在其他模块中寻找其定义。

 

15. struct关键字: --- 写程序的时候尽量别使用全局变量,而是打包成结构体

  将相关联的数据打包成一个整体;空结构体的大小不是0,而是1;

  柔性数组:结构体最后的数组大小未知,内核链表中用柔性数组较多。

Type *p=( Type*)malloc(sizeof(Type)+100*sizeof(int));

【柔性数组与结构体没关系,算不上结构体的正式成员。】

struct和class:默认属性不同,struct是public,class是private。

 

16. union关键字:

  大小是联合体中最大的成员的大小,而不是所有成员的大小和,此点和结构体不同;同一时间联合体只能访问数据成员中的一个,不能访问多个。

用联合体可以判断大小端模式的问题: 

void check(void)
{union{inti;intj;} stu;stu.i= 5;return(5 == stu.j):1,0;
}

17. enum关键字:

  --- 枚举定义的是一堆常量,比如星期,颜色等

 

18. typedef关键字: --- 起别名,注意与define的区别,个人认为比define好用

typedef unsigned char uchar;

#define uchar unsigned char

(typedef结尾加分号,define不需要)

推荐使用typedef,因为在给指针进行替换的时候,define往往达不到效果;

#define char* PPP

PPP a,b;//只有a是char*的,b不是,用typedef就不同

 


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

调色板栅格数据使用GDAL时注意

这几天用GDAL处理DRG数据时发现&#xff0c;有数据被处理成了黑板&#xff0c;什么都没有&#xff0c;发现是因为DRG图像颜色比较简单&#xff0c;使用了调色板的缘故。 使用SetColorTable将调色板写入后&#xff0c;一部分基本正常&#xff0c;但还有些图像还是有黑板的现象。…

jQuery实现表格行上移下移和置顶

<!DOCTYPE HTML> <html> <head> <meta charset"utf-8"> <meta name"viewport" content"widthdevice-width, initial-scale1, maximum-scale1"> <title>jQuery实现表格行上移下移和置顶</title> <m…

做算法,为什么建议你一定要学懂C++?

在工业界&#xff0c;有这样一个规律&#xff1a;“ 但凡能用其他语言的都不会用C&#xff0c;只能用C的必然用C。”但是&#xff0c;C的学习和项目开发都比较困难。一个有经验的老手也经常搞出野指针&#xff0c;内存泄露等bug&#xff0c;包括我自己在学C的时候也非常痛苦。所…

顺序查找法

#include<stdio.h> #define KeyType int #define OtherType int #define List_size 100 typedef struct{KeyType key;OtherType other; }RecordType; typedef struct{RecordType r[List_size];int length; }Recordlist; int SeqSearch(Recordlist l,int k)//没有设置监视…

IT行业专业术语

IT行业专业术语 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 目前比较流行的开发语言有哪些&#xff1f; Java、C#(C Sharp)、C、C、JavaScript、PHP、Ruby、Python等 WEB端有哪些开发技术&#xff1f; Javascript、CSS、HTML、Ajax、Flex等 比较…

AI一键注释代码、阅读整个项目、转换编程语言。已开源!

获取github源码地址和国内url、key方式&#xff1a;在文章底部 大家好今天给大家介绍一款开源项目&#xff0c;这个项目是由渡码维护的&#xff0c;这个项目支持自己的大模型和使用openai两种方式&#xff0c;本文章介绍使用openai的方式&#xff01; 使用过程中发现两个问题…

为什么别人赚钱比自己容易?

之前的文章提到自己的一个同事&#xff0c;在一家公司干了10年&#xff0c;最近跳槽找了份5万薪水的工作&#xff0c;大家都很想听他的故事。为了方便记录&#xff0c;我叫他文哥文哥比我们一般的毕业生厉害&#xff0c;他比我大将近9岁&#xff0c;我在初中的时候他已经是一个…

Linux下遍历目录下的文件

方法1&#xff1a;http://tag.csdn.net/Article/ef431d9b-68b3-419f-9f85-1fb9279f904a.html//ListFile.cpp#include <stdio.h>#include <dirent.h>#include <sys/types.h>intmain(intargc, char*argv[]){ if (2 ! argc){ printf("Usage:ListFileSource…

折半查找

折半查找又为二分查找&#xff0c;对待查找的列表有两个要求&#xff1a;1.必须采用顺序存储结构。 2.必须按关键字大小顺序排列。 #include<stdio.h> #define Max 100 typedef struct {int key;int other; }RecordType; typedef struct {RecordType r[Max];int lenght; …

15张图来了解【树】,面试再也不怕被刷了

我之前的文章C语言实现树&#xff0c;你一定看得懂树的概念什么是树&#xff1f;树属于非线性数据结构的一种&#xff0c;概念也极多&#xff0c;是由结点或顶点和边组成的且不存在着任何环的一种数据结构。没有结点的树称为空树。一棵非空的树包括一个根结点&#xff0c;还很可…

String源码图

String StringBuffer StringBuilder 均为对字符数组的操作。 实现了不同的接口&#xff0c;导致不同的覆写。 实现了同样的接口&#xff0c;适应不同的场景。 转载于:https://www.cnblogs.com/zhengwenqiang/p/8076495.html

C语言——位操作

C语言——位操作 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、基本位操作 | 或 & 与 ~ 取反 ^ 异或 << 左移 >> 右移 二、位操作的常见用法 1.获取某位的值 #define BitGet(Number,pos) ((Number)| 1<<(…

架构设计中的方法学(七)

十三、代码验证   要保证架构的稳定和成功&#xff0c;利用代码对架构进行验证是一种实用的手段。代码验证的核心是测试&#xff0c;特别是单元测试。而测试的基本操作思路是测试优先&#xff0c;它是敏捷方法中非常重要的一项实践&#xff0c;是重构和稳定核模式的重要保障。…

十进制转二进制,八进制,十六进制

十进制转二进制&#xff1a; #include<stdio.h> int main() {int a[20],x;int rem,i0;scanf("%d",&x);do{remx%2;xx/2;a[i]rem;i;}while(x!0);while(i>0)printf("%d",a[--i]);printf("\n");return 0; }十进制转八进制&#xff1a; …

呵,你会51单片机的精确延时吗?

文章整理自网络序对于某些对时间精度要求较高的程序&#xff0c;用 c 写延时显得有些力不从心&#xff0c;故需用到汇编程序。本人通过测试&#xff0c;总结了 51 的精确延时函数(在 c 语言中嵌入汇编)分享给大家。至于如何在 c 中嵌入汇编大家可以去网上查查&#xff0c;这方面…

SignalR

原址: http://www.cnblogs.com/shanyou/archive/2012/07/28/2613693.html SignalR是什么&#xff1f; SignalR是一个继承的客户端与服务器库&#xff0c;基于浏览器的客户端和基于ASP.NET的服务器组件可以借助它来进行双向多步对话&#xff0c;换句话说&#xff0c;该对话可不…

C语言——数组、函数、指针

C语言——数组、函数、指针 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、有什么作用&#xff1f;为什么要使用它们&#xff1f; &#xff08;1&#xff09;数组&#xff1a;提供一段连续的存储空间&#xff0c;存数据和字符串很方便&#xff1b; …

--4、实验室设备管理(表)

--4、实验室设备管理create table Computer( Computer_id int Identity Primary key,--设备编号 Computer_name varchar(50) not null,--设备名称 Computer_num varchar(50) not null,--设备编号,财产号 room_id int not null,--实验室编号 --Computer_IP varchar(128), -…

十六进制转十进制

问题描述从键盘输入一个不超过8位的正的十六进制数字符串&#xff0c;将它转换为正的十进制数后输出。注&#xff1a;十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。样例输入FFFF样例输出65535 #include<stdio.h> #include<string.h> #include<…

C#中Invoke的用法

在用.NET Framework框架的WinForm构建GUI程序界面时&#xff0c;如果要在控件的事件响应函数中改变控件的状态&#xff0c;例如&#xff1a;某个按钮上的文本原先叫“打开”&#xff0c;单击之后按钮上的文本显示“关闭”&#xff0c;初学者往往会想当然地这么写&#xff1a; v…