C语言符号及关键字详解.docx
- 文档编号:26334717
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:11
- 大小:20.19KB
C语言符号及关键字详解.docx
《C语言符号及关键字详解.docx》由会员分享,可在线阅读,更多相关《C语言符号及关键字详解.docx(11页珍藏版)》请在冰豆网上搜索。
C语言符号及关键字详解
常用符号定义优先级高,低
()最高
[]最高
.最高把n值赋给结构中的某个元素
例如:
Emp.wage=123.23
!
逻辑非!
0为真
~求1的补(取反)00101100
11010011
++自增1a++参与运算后加1放入a中
++a加1后参与运算
--自减1a—--—a
&取地址&a取a的地址
*取地址的补*a取地址a中的值
Sizeof取数据的字节数sizeoffsizeof(int)
==================================================
*乘
/除
%模除(求余)5%2为1
+加
-减
<<位:
左移1位相当于乘2
>>位:
右移1位相当于除2
=================================================
〈〈=小于等于
>>=大于等于
==等于
=!
不等于
&位与两者为1结果为1否则为0
=================================================
^位异或两者值相同结果为0否则为1
︱位或运算两者值为0结果为0否则为1
&&逻辑与a,b分别为1,2a&&b位真
‖逻辑非a,b分别为1,2a‖b位真
?
代替if的问号
例如x=10
y=x>9?
100:
200y值为100
:
=================================================
=
+=a+=b等效a=a+b
-=
*=
/=
C语言中的关键字:
auto:
声明自动变量一般不使用
double:
声明双精度变量或函数
int:
声明整型变量或函数
struct:
声明结构体变量或函数
break:
跳出当前循环
else:
条件语句否定分支(与if连用)
long:
声明长整型变量或函数
switch:
用于开关语句
case:
开关语句分支
enum:
声明枚举类型
register:
声明积存器变量
typedef:
用以给数据类型取别名(当然还有其他作用)
char:
声明字符型变量或函数
extern:
声明变量是在其他文件正声明(也可以看做是引用变量)
return:
子程序返回语句(可以带参数,也可以不带参数)
union:
声明联合数据类型
const:
声明只读变量
float:
声明浮点型变量或函数
short:
声明短整型变量或函数
unsigned:
声明无符号类型变量或函数
continue:
结束当前循环,开始下一轮循环
for:
一种循环语句(可意会不可言传)
signed:
声明有符号类型变量或函数
void:
声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)
default:
开关语句中的“其他"分支
goto:
无条件跳转语句
使用goto语句应注意的问题:
goto语句不能跨越变量的定义向前跳转:
//。
.....
gotoend;
intix=10;
end:
ix=42;//会出现ix未定义的情形
而向后跳过已经执行的变量定义语句是合法的。
因为向后跳回到一个变量定义之前,系统在撤销这个变量,然后重新创建它:
//.。
.。
.。
.。
..
begin:
intsz=get_size();
if(sz〈=0)gotobegin;
执行goto语句时,首先撤销变量sz,然后程序的控制流程跳转到带begin:
标号的语句继续执行,再次重新创建和初始化变量sz。
sizeof:
计算数据类型长度
volatile:
说明变量在程序执行中可被隐含地改变
do:
循环语句的循环体
while:
循环语句的循环条件
static:
声明静态变量
if:
条件语句
′最低
语句格式语意
Ifif(表达式)如果表达式为真则执行
语句;
If—elseif(表达式)
语句1;
Else如果表达式为真则执行1
语句2;否则执行2
If-else-ifif(表达式1)如果表达式为真执行1
语句1;
Elseif(表达式2)如果表达式为真执行2
语句2;
Elseif(表达式3)……
语句3;
……
------—-———---——-——-——--———--——-——-———-——---—---—-—-—------——--————--—————----—----
Switchswitch(表达式)判断表达式和常量表达式
{和常量表达式值是否相等
Case常量表达式1:
语句1;
Case常量表达式2:
语句2;
Case常量表达式3:
语句3;
……
Default:
语句n+1;不满足所有条件执行
}
——-—-—--—-—---—-——-——-—--————-—————-—-—----—--—-----—--——-—————--—-———-—-————--———-
Forfor(表达式1;表达式2;表达式3)
{
语句//循环体
}
表达式1通常是赋初值
表达式2通常是循环条件
表达式3通常是修改循环变量的值
———-——---——-——-——-—-----————--—--——--—-—-—-—-——---—--——--—--——-——----—----——-—--————-————
Whilewhile(表达式)表达式为真时执行语句
{非0为真
语句//循环体
}
例如:
Intsum=0;
Inta;
While(a<=10)
{
Sum+=a;
A++;}
Do—whiledo先执行一次循环体在判断
{表达式的值
语句//循环体
}
While(表达式);
例如:
Intsum=0;
Inta;
Do
{
Sum+=a;
A++;
}
While(a<=10);
------————--————-——-————---—-—-——-----——————---——---——--—---—-—-—-—-—-----——-—-——----—-—-
Breakbreak;不在判断与switch合用
Continuecontinue;终止本次循环
Return
Gotogoto语句标号;很少用
(1)auto
这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量.这个关键字不怎么多写,因为所有的变量默认就是auto的.
(2)register
这个关键字命令编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。
(3)static
常见的两种用途:
1〉统计函数被调用的次数;
2〉减少局部数组建立和赋值的开销。
变量的建立和赋值是需要一定的处理器开销的,特别是数组等含有较多元素的存储类型。
在一些含有较多的变量并且被经常调用的函数中,可以将一些数组声明为static类型,以减少建立或者初始化这些变量的开销.
详细说明:
1>、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。
这一点是它与堆栈变量和堆变量的区别.
2>、变量用static告知编译器,自己仅仅在变量的作用范围内可见。
这一点是它与全局变量的区别。
3>当static用来修饰全局变量时,它就改变了全局变量的作用域,使其不能被别的程序extern,限制在了当前文件里,但是没有改变其存放位置,还是在全局静态储存区。
使用注意:
1〉若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
2>若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
3〉设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题(只要输入数据相同就应产生相同的输出)
(4)const
被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
它可以修饰函数的参数、返回值,甚至函数的定义体。
作用:
1>修饰输入参数
a.对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是提高效率.例如将voidFunc(Aa)改为voidFunc(constA&a).
b.对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递".否则既达不到提高效率的目的,又降低了函数的可理解性。
例如voidFunc(intx)不应该改为voidFunc(constint&x)。
2〉用const修饰函数的返回值
a.如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。
如对于:
constchar*GetString(void);
如下语句将出现编译错误:
char*str=GetString();//cannotconvertfrom’constchar*’to'char*’;
正确的用法是:
constchar*str=GetString();
b.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。
如不要把函数intGetInt(void)写成constintGetInt(void)。
3〉const成员函数的声明中,const关键字只能放在函数声明的尾部,表示该类成员不修改对象。
说明:
consttypem;//修饰m为不可改变
示例:
typedefchar*pStr;//新的类型pStr;
charstring[4]="abc";
constchar*p1=string;
p1++;//正确,上边修饰的是*p1,p1可变
constpStrp2=string;
p2++;//错误,上边修饰的是p2,p2不可变,*p2可变
同理,const修饰指针时用此原则判断就不会混淆了.
constint*value;//*value不可变,value可变
int*constvalue;//value不可变,*value可变
const(int*)value;//(int*)是一种type,value不可变,*value可变
//逻辑上这样理解,编译不能通过,需要tydefint*NewType;
constint*constvalue;//*value,value都不可变
(5)volatile
表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
它可以适用于基础类型如:
int,char,long。
。
..。
.也适用于C的结构和C++的类.当对结构或者类对象使用volatile修饰的时候,结构或者类的所有成员都会被视为volatile。
该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程.
简单示例:
DWORD__stdcallthreadFunc(LPVOIDsignal)
{
int*intSignal=reinterpret_cast(signal);
*intSignal=2;
while(*intSignal!
=1)
sleep(1000);
return0;
}
该线程启动时将intSignal置为2,然后循环等待直到intSignal为1时退出。
显然intSignal的值必须在外部被改变,否则该线程不会退出.但是实际运行的时候该线程却不会退出,即使在外部将它的值改为1,看一下对应的伪汇编代码就明白了:
movax,signal
label:
if(ax!
=1)
gotolabel
对于C编译器来说,它并不知道这个值会被其他线程修改.自然就把它cache在寄存器里面。
C编译器是没有线程概念的,这时候就需要用到volatile。
volatile的本意是指:
这个值可能会在当前线程外部被改变.也就是说,我们要在threadFunc中的intSignal前面加上volatile关键字,这时候,编译器知道该变量的值会在外部改变,因此每次访问该变量时会重新读取,所作的循环变为如下面伪码所示:
label:
movax,signal
if(ax!
=1)
gotolabel
注意:
一个参数既可以是const同时是volatile,是volatile因为它可能被意想不到地改变。
它是const因为程序不应该试图去修改它。
(6)extern
extern意为“外来的"···它的作用在于告诉编译器:
有这个变量,它可能不存在当前的文件中,但它肯定要存在于工程中的某一个源文件中或者一个Dll的输出中。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 符号 关键字 详解