1.C语言关键字(auto break case char const swtich)

ANSI C标准C语言共有32个关键字,分别为:

auto break case char const continue default do double else enum extern

float for goto if int long register return short signed sizeof static struct switch

typedef union unsigned void volatile while

1)auto:一个自动存储变量的关键字,也就是声明一块临时的变量内存。

1 auto double a = 3.7;

表明a为一个自动存储的临时变量。

2)break

break语句通常用在循环语句和开关语句中。当break用于开关语句switch中时,可使程序跳出switch而执行switch以后的语句;如果没有break语句,则会从满足条件的地方(即与switch(表达式)括号中表达式匹配的case)开始执行,直到switch结构结束。

当break语句用于do-while、for、while循环语句中时,可使程序终止循环。而执行循环后面的语句,通常break语句总是与if语句联在一起。即满足条件时便跳出循环。

 1 //例: 2 main()
 3 {
 4 int i=0;
 5 char c;
 6 while(1) /*设置循环*/
 7  {
 8 c=‘\0‘; /*变量赋初值*/
 9 while(c!=13&&c!=27) /*键盘接收字符直到按回车或Esc键*/
10 {
11 c=getch();
12 printf("%c\n",c);
13 }
14 if(c==27)
15 break; /*判断若按Esc键则退出循环*/
16 i++;
17 printf("The No. is %d\n",i);
18 }
19 printf("The end");
20 }

注意:

  • break语句对if-else的条件语句不起作用
  • 在多层循环中,一个break语句只向外跳一层

3)switch与case:顾名思义,switch即切换的意思,case即情况

在C语言中switch和case一起使用,是一个判断选择代码,其功能就是控制业务流程流转的。

switch语句的语法如下:

 1 switch ( controllingExpression )
 2 {
 3 case constantExpression1 :
 4 case constantExpression2 :
 5 case constantExpression3 :
 6 statements; /*当满足constantExpression1、constantExpression2、 constantExpression3任何一个都执行statements */
 7 break;
 8 case constantExpression :
 9 statements ;
10 break;
11 ...
12 default :
13 statements ;
14 break;
15 }

switch语句非常有用,但在使用时必须谨慎。所写的任何switch语句都必须遵循以下规则:

  • 只能针对基本数据类型使用switch,这些类型包括int、char等。对于其他类型,则必须使用if语句。
  • switch()的参数类型不能为实型 。
  • case标签必须是常量表达式(constantExpression),如42或者"42"。
  • case标签必须是惟一性的表达式;也就是说,不允许两个case具有相同的值。

4)char:char是C/C++整型数据中比较古怪的一个,其它的如int/long/short等不指定signed/unsigned时都默认是signed,但char在标准中是unsigned,编译器可以实现为带符号的,也可以实现为不带符号的。

  • char表示字符: char ch = ‘A‘;
  • char表示字符串:char ch[SIZE] = "ABCD";

5)const:常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。(当然,我们可以偷梁换柱进行更新;)

C语言为什么引入const?

答:const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。

const的主要作用?

答:(1)可以定义const常量,具有不可变性。 
  例如:const int Max=100; Max++会产生错误; 
  (2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。
  例如: void f(const int i) { .........} 编译器就会知道i是一个常量,不允许修改; 
  (3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。 同宏定义一样,可以做到不变则已,一变都变!
  如(1)中,如果想修改Max的内容,只需要:const int Max=you want;即可! 
  (4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 还是上面的例子,如果在函数体内修改了i,编译器就会报错; 
  例如: void f(const int i) { i=10;//error! } 
  (5) 可以节省空间,避免不必要的内存分配。 例如:

 #define PI 3.14159 //常量宏
  const double Pi=3.14159; //此时并未将Pi放入RAM中 ......
  double i=Pi; //此时为Pi分配内存,以后不再分配!
  double I=PI; //编译期间进行宏替换,分配内存
  double j=Pi; //没有内存分配
  double J=PI; //再进行宏替换,又一次分配内存! 

  const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干份拷贝。 
  (6) 提高了效率。 
  编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

问题一、const常量&变量

例:为什么下面的例子在使用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢?

const int n = 5;

int a[n];

答案与分析:

1)这个问题讨论的是“常量”与“只读变量”的区别。常量,例如5, "abc",等,肯定是只读的,因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。而ANSI C规定数组定义时长度必须是“常量”,“只读变量”也是不可以的,“常量”不等于“不可变的变量”。

2)那么,在ANSI C中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量。

问题二:const怎样限定内容?

例:下面的代码编译器会报一个错误,请问,哪一个语句是错误的呢?

typedef char * pStr;
char string[4] = "bbc";
const char *p1 =" string"; //1式
const pStr p2 =" string"; //2式
p1++;
p2++;

答案与分析:

问题出在p2++上。

const使用的基本形式: const type m;限定m不可变。替换基本形式中的m为1式中的*p1,替换后const char *p1;限定*p1不可变,当然p1是可变的,因此问题中p1++是对的。替换基本形式中的type为2式中的pStr,替换后const pStr m;限定m不可变,题中的pStr就是一种新类型,因此问题中p2不可变,p2++是错误的。

问题三:const&指针

例一

下面分别用const限定不可变的内容是什么?

1)const在前面

const int nValue; //nValue是const

const char *pContent; //*pContent是const, pContent可变

const char* const pContent; //pContent和*pContent都是const

2)const在后面,与上面的声明对等

int const nValue; //nValue是const

char const * pContent; //*pContent是const, pContent可变

char* const pContent; //pContent是const,*pContent可变

char const* const pContent; //pContent和*pContent都是const

答案与分析:

const和指针一起使用是C语言中一个很常见的困惑之处,在实际开发中,特别是在看别人代码的时候,常常会因为这样而不好判断作者的意图,下面讲一下我的判断原则:

const只修饰其后的变量,至于const放在类型前还是类型后并没有区别。如:const int a和int const a都是修饰a为const。注意*不是一种类型,如果*pType之前是某类型,那么pType是指向该类型的指针

一个简单的判断方法:指针运算符*,是从右到左,那么如:char const * pContent,可以理解为char const (* pContent),即* pContent为const,而pContent则是可变的。[1]

例二

int const * p1,p2;

p2是const;(*p1)是一整体,因此(*p1)是const,但p1是可变的。int * p1,p2只代表p1是指向整型的指针,要表示p1、p2都是指针是需写成int * p1,* p2。所以无论是* const p1,p2还是const * p1,p2,里面的*都是属于p1的。

例三

int const * const p1,p2;

p2是const,是前一个const修饰的,*p1也被前一个const修饰,而p1被后一个const修饰。

例四

int * const p1,p2;

p1是const,(* const p1)是整体,所以const不修饰p2。

例五

指针指向及其指向变量的值的变化

const在*的左边,则指针指向的变量的值不可直接通过指针改变(可以通过其他途径改变);在*的右边,则指针的指向不可变。简记为“左定值,右定向”。

1)指针指向的变量的值不能变,指向可变

int x = 1;
int y = 2;
const int* px = &x;
int const* px = &x; //这两句表达式一样效果
px = &y; //正确,允许改变指向
*px = 3; //错误,不允许改变指针指向的变量的值

2)指针指向的变量的值可以改变,指向不可变

int x = 1;
int y = 2;
int* const px = &x;
px = &y; //错误,不允许改变指针指向
*px = 3; //正确,允许改变指针指向的变量的值

3)指针指向的变量的值不可变,指向不可变

补充

在c中,对于const定义的指针,不赋初值编译不报错,

int* const px;这种定义是不允许的。(指针常量定义的时候对其进行初始化)

int const *px;这种定义是允许的。(常指针可以再定义的时候不初始化)

强烈建议在初始化时说明指针的指向,防止出现野指针!

时间: 2024-10-21 07:00:52

1.C语言关键字(auto break case char const swtich)的相关文章

C 语言关键字

C 语言关键字 auto 局部变量(自动储存) break无条件退出程序最内层循环 case switch语句中选择项 char单字节整型数据 const定义不可更改的常量值 continue中断本次循环,并转向下一次循环 default switch语句中的默认选择项 do 用于构成do-..while循环语句 double定义双精度浮点型数据 else构成if-..else选择程序结构 enum枚举 extern在其它程序模块中说明了全局变量 float定义单精度浮点型数据 for构成for

C语言中关键字auto、static、register、const、volatile、extern的作用

原文:C语言中关键字auto.static.register.const.volatile.extern的作用 关键字auto.static.register.const.volatile.extern 这些关键词都是c++基础知识,我整理了一下,希望对新学的朋友们有用: (1)auto 这个这个关键字用于声明变量的生存期为自动,即将不在任何类.结构.枚举.联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量.这个关键字不怎么多写,因为所有的变量默认就是auto的. (2)reg

Docs-.NET-C#-指南-语言参考-关键字-值类型:char

ylbtech-Docs-.NET-C#-指南-语言参考-关键字-值类型:char 1.返回顶部 1. char(C# 参考) 2019/10/22 char 类型关键字是 .NET System.Char 结构类型的别名,它表示 Unicode UTF-16 字符: 类型 范围 大小 .NET 类型 char U+0000 到 U+FFFF 16 位 System.Char 文本 char 类型的常量可以编写为字符文本.十六进制转义序列或 Unicode 表示形式. 也可以将整型字符代码强制转

C语言关键字

常用c语言关键字 C 语言标准定义的32 个关键字:auto 声明自动变量,缺省时编译器一般默认为autoint 声明整型变量double 声明双精度变量long 声明长整型变量char 声明字符型变量float 声明浮点型变量short 声明短整型变量signed 声明有符号类型变量unsigned 声明无符号类型变量struct 声明结构体变量union 声明联合数据类型enum 声明枚举类型static 声明静态变量switch 用于开关语句case 开关语句分支default 开关语句中

李洪强iOS开发之OC[016]C语言关键字

// //  main.m //  04 - C语言关键字 // //  Created by vic fan on 16/7/12. //  Copyright © 2016年 李洪强. All rights reserved. // C语言关键字 A -  数据相关 1) 基本数据类型(5个) void    空   没有的意思 char    字符 占 1个字节(char的本质也是数字) int     整数  4个字节 float   浮点数  (小数点)保留7位有效数字 double 

iOS-C_C语言关键字

C语言关键字 所谓关键字就是已被 C语言编辑工具本身使用, 不能作其它用途使用的字. auto :声明自动变量 一般不使用 double :声明双精度变量或函数 int: 声明整型变量或函数 struct:声明结构体变量或函数 break:跳出当前循环 else :条件语句否定分支(与 if 连用) long :声明长整型变量或函数 switch :用于开关语句 case:开关语句分支 enum :声明枚举类型 register:声明寄存器变量 typedef:用以给数据类型取别名(当然还有其他

C语言关键字详解

相对于其他语言来说,C语言的关键字算是少的了.在C98中关键子总共只有32个,我们来分析一下每个关键字在C语言中它独特的作用. 1.关于数据类型的关键字 (1) char :声明字符型变量或函数  (2) double :声明双精度变量或函数  (3) enum :声明枚举类型 enum类型可以增加可读性,可移植性:在enum中定义的每个对象,默认都是从0开始,当然也可以自定义.如下: enum Color{RED,BLACK,WHITE}; enum Number{ONE=1,TWO,THRE

FILE不是C语言关键字

FILE不是C语言关键字,只是标准C中的标准输入输出中定义的一个新的数据类型 stdio.htypedef struct _iobuf{ char* _ptr; int _cnt; char* _base; int _flag; int _file; int _charbuf; int _bufsiz; char* _tmpfname;} FILE; FILE 主要用来定义带缓冲的文件指针,如:FILE *fp; 附:C语言一共有32个关键字,如下: auto 局部变量(自动储存)break 无

读书笔记-C语言关键字

001 关键字 C语言一共32个关键字 1. 声明和定义 在开始认识关键字前,必须要明白什么是声明,什么事定义: 定义:(编译器)创建一个对象,为这个对象分配一段内存并给他取上一个名字.在一个作用域内,一个变量或者对象只能定义一次,并且定以后为它分配的内存不可变: 声明:1.告诉编译器这个名字已经和一片内存匹配上了,并且这个内存是在其他地方定义的,声明可以多次:2.告诉编译器,这个名字已经占用,不能再用来定义其他变量或者对象了. 备注:定义创建了对象,并为它分配了内存,声明没有分配内存 2. 关