C语言符号及关键字详解

来源:互联网 发布:淘宝上的星巴克月饼券 编辑:程序博客网 时间:2024/06/07 03:36

常用符号       定义优先级  高,低

()           最高

[]            最高

­­­­­­ ­­­  .            最高   把n值赋给结构中的某个元素

                       例如:  Emp.wage=123.23

              逻辑非    0    为真

   ~            求1的补(取反)00101100

                                  11010011

   + +          自增1   a++   参与运算后加1放入a中

                          ++a  加1后参与运算

   - -            自减1   a--    - -a

   &             取地址    &a  取a的地址

   *             取地址的补   *a  取地址a中的值

Sizeof           取数据的字节数   sizeof f   sizeof(int)

==================================================

   *              乘

   /               除

   %            模除(求余)5%2  为1

   +              加

-                                                                     

<<             位 :左移1位  相当于乘2

>>             位 :右移1位  相当于除2

=================================================

<<=              小于等于

>>=              大于等于

==               等于

=!              不等于

&               位与   两者为1 结果为1     否则为0

=================================================

^                位异或  两者值相同结果为否则为1

               位或运算  两者值为0结果为0否则为1

&&              逻辑与  ab分别为12  a&&b位真

                逻辑非  ab分别为1ab位真

?                 代替if的问号 

                      例如  x=10

y=x>9?100 : 200    y值为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语句不能跨越变量的定义向前跳转:

//......

goto end;

int ix=10;

end:

ix=42;//会出现ix未定义的情形

  而向后跳过已经执行的变量定义语句是合法的。因为向后跳回到一个变量定义之前,系统在撤销这个变量,然后重新创建它:

//..........

begin:

int sz=get_size();

if(sz<=0) goto begin;

  执行goto语句时,首先撤销变量sz,然后程序的控制流程跳转到带begin:标号的语句继续执行,再次重新创建和初始化变量sz

sizeof:计算数据类型长度

volatile:说明变量在程序执行中可被隐含地改变

do :循环语句的循环体

while :循环语句的循环条件

static :声明静态变量

if:条件语句

 

′                        最低

    语句                 格式          语意

If               if  (表达式)     如果表达式为真则执行

                     语句;

If-else           if    (表达式)  

                      语句1;

                Else              如果表达式为真则执行1

                      语句2;     否则执行2

If-else-if         if    (表达式1)  如果表达式为真执行1

                      语句1;    

                Else if  (表达式2)如果表达式为真执行2

                       语句2;

                Else if   (表达式3)……

                       语句3;

                      ……

-----------------------------------------------------------------------------------

Switch          switch (表达式)  判断表达式和常量表达式

                {                和常量表达式值是否相等

                Case 常量表达式1:语句1;

                Case 常量表达式2:语句2;

                Case 常量表达式3:语句3;

                ……

               Default:语句 n+1;   不满足所有条件执行

               }

-----------------------------------------------------------------------------------

For            for (表达式1;表达式2;表达式3)

               {

                    语句     // 循环体

}       

表达式1 通常是赋初值

表达式2 通常是循环条件

表达式3 通常是修改循环变量的值

-----------------------------------------------------------------------------------------

While          while(表达式)    表达式为真时执行语句

              {                   非0为真

     语句     //循环体

}

例如:

Int sum=0;

Int a;

While(a<=10)

{

      Sum+=a;

      A++;}

Do-while        do             先执行一次循环体在判断

               {               表达式的值

                   语句    //循环体

}

While (表达式);

例如:

Int sum=0;

Int a;

Do

{

   Sum+=a;

   A++;

}

While (a<=10);

-----------------------------------------------------------------------------------------

Break         break;   不在判断与switch合用

Continue       continue;终止本次循环

Return

Goto           goto 语句标号;   很少用

(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引用传递”,目的是提高效率。例如将void Func(A a) 改为void Func(const A &a)。

b.对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x) 不应该改为void Func(const int &x)。

2>用const修饰函数的返回值

a.如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。

如对于: const char *GetString(void);

如下语句将出现编译错误:

char *str = GetString();//cannot convert from 'const char*' to 'char *';

正确的用法是:

const char *str = GetString();

b.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。 如不要把函数int GetInt(void) 写成const int GetInt(void)。

3>const成员函数的声明中,const关键字只能放在函数声明的尾部,表示该类成员不修改对象.

 

   说明:

const type m; //修饰m为不可改变

示例:

typedef char * pStr; //新的类型pStr;

char string[4] = "abc";

const char *p1 = string;

p1++; //正确,上边修饰的是*p1,p1可变

const pStr p2 = string;

p2++; //错误,上边修饰的是p2,p2不可变,*p2可变

同理,const修饰指针时用此原则判断就不会混淆了。

 

const int *value; //*value不可变,value可变

int* const value; //value不可变,*value可变

const (int *) value; //(int *)是一种type,value不可变,*value可变

//逻辑上这样理解,编译不能通过,需要tydef int* NewType;

const int* const value;//*value,value都不可变

 

 

 

(5)volatile

  表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。它可以适用于基础类型如:int,char,long......也适用于C的结构和C++的类。当对结构或者类对象使用volatile修饰的时候,结构或者类的所有成员都会被视为volatile.

该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程。

简单示例:

DWORD __stdcall threadFunc(LPVOID signal)

{

int* intSignal=reinterpret_cast(signal);

*intSignal=2;

while(*intSignal!=1)

sleep(1000);

return 0;

}

该线程启动时将intSignal 置为2,然后循环等待直到intSignal 为1 时退出。显然intSignal的值必须在外部被改变,否则该线程不会退出。但是实际运行的时候该线程却不会退出,即使在外部将它的值改为1,看一下对应的伪汇编代码就明白了:

mov ax,signal

label:

if(ax!=1)

goto label

对于C编译器来说,它并不知道这个值会被其他线程修改。自然就把它cache在寄存器里面。C 编译器是没有线程概念的,这时候就需要用到volatile。volatile 的本意是指:这个值可能会在当前线程外部被改变。也就是说,我们要在threadFunc中的intSignal前面加上volatile关键字,这时候,编译器知道该变量的值会在外部改变,因此每次访问该变量时会重新读取,所作的循环变为如下面伪码所示:

label:

mov ax,signal

if(ax!=1)

goto label

 

  注意:一个参数既可以是const同时是volatile,是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

 

(6)extern

extern 意为“外来的”···它的作用在于告诉编译器:有这个变量,它可能不存在当前的文件中,但它肯定要存在于工程中的某一个源文件中或者一个Dll的输出中。

 

0 0
原创粉丝点击