C语言程序设计之基础(变量、运算符、数组、函数)

来源:互联网 发布:域名备案批量查询工具 编辑:程序博客网 时间:2024/05/17 06:15
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、变量

命名规范:数字、字母、下划线,都可以为变量命名。做为变量名的开头不能为数字,变量名不能为关键字。

C语言中的变量,按照作用于可以分为两种,局部变量和全局变量。

局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。如下所示:

int f1(int a){    int b,c;  /* a,b,c仅在函数f1()内有效 */}int f2(int x){    int y,z;  /* x,y,z仅在函数f2()内有效 */}void main(){    int m,n;  /* m,n仅在函数main()内有效 */}

在函数f1内定义了三个变量,a为形参,b、c为一般变量。在 f1的范围内a、b、c有效,或者说a、b、c变量的作用域限于f1内。同理,x、y、z的作用域限于f2内。m、n的作用域限于main函数内。

关于局部变量的作用域还要说明以下几点:

  • 主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。同时,主函数中也不能使用其它函数中定义的变量。因为主函数也是一个函数,它与其它函数是平行关系。这一点是与其它语言不同的,应予以注意。 
  • 形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。 
  • 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。如在前例中,形参和实参的变量名都为n,是完全允许的。 

在复合语句中也可定义变量,其作用域只在复合语句范围内。

#include <stdio.h>int main(void){    int i=2, j=3, k;    k=i+j;        {        int k=8;        printf("%d\n",k);    }    printf("%d\n",k);    return 0;}

本程序在main中定义了i、j、k三个变量,其中k未赋初值。而在复合语句内又定义了一个变量k,并赋初值为8。应该注意这两个k不是同一个变量。在复合语句外由main定义的k起作用,而在复合语句内则由在复合语句内定义的k起作用。因此程序第3行的k为main所定义,其值应为5。第6行输出k值,该行在复合语句内,由复合语句内定义的k起作用,其初值为8,故输出值为8,第8行输出i,k值。i是在整个程序中有效的,第6行对i赋值为3,故以输出也为3。而第8行已在复合语句之外,输出的k应为main所定义的k,此k值由第3 行已获得为5,故输出也为5。

全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern。但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。例如:

int a,b;  /* 外部变量 */void f1(){  /* 函数f1 */    /* …… */}float x,y;  /* 外部变量 */int fz(){  /* 函数fz */    /* …… */}main(){  /* 主函数 */    /* …… */}

从上例可以看出a、b、x、y 都是在函数外部定义的外部变量,都是全局变量。但x、y 定义在函数f1之后,而在f1内又无对x、y的说明,所以它们在f1内无效。a、b定义在源程序最前面,因此在f1、f2及main内不加说明也可使用。

如果同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用。

二、运算符

名称

符号

说明

加法运算符

+

双目运算符,即应有两个量参与加法运算。如a+b,4+8等。具有右结合性。

减法运算符

-

双目运算符。但“-”也可作负值运算符,此时为单目运算,如-x,-5等具有左结合性。

乘法运算符

*

双目运算符,具有左结合性。

除法运算符

/

双目运算符,具有左结合性。参与运算量均为整型时,结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为双精度实型。

求余运算符(模运算符)

%

双目运算符,具有左结合性。要求参与运算的量均为整型,不能应用于float或double类型。 求余运算的结果等于两数相除后的余数,整除时结果为0。

自增、自减运算符

++

--

自增1运算符记为“++”,其功能是使变量的值自增1;自减1运算符记为“--”,其功能是使变量值自减1。

按位与运算符

&

按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。

按位或运算符

|

按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。

按位异或运算符

^

按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现。

取反运算符

~

求反运算符~为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位求反。

左移运算符

<<

左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。

右移运算符

>>

右移运算符“>>”是双目运算符。其功能是把“>>”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。


三、数组
  

在C语言中使用数组必须先进行定义。一维数组的定义方式为:

类型说明符  数组名  [常量表达式];

其中,类型说明符是任一种基本数据类型或构造数据类型。数组名是用户定义的数组标识符。方括号中的常量表达式表示数据元素的个数,也称为数组的长度。例如:

int a[10];  /* 说明整型数组a,有10个元素 */float b[10], c[20];  /* 说明实型数组b,有10个元素,实型数组c,有20个元素 */char ch[20];  /* 说明字符数组ch,有20个元素 */

对于数组类型说明应注意以下几点:

  1. 数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。
  2. 数组名的书写规则应符合标识符的书写规定。
  3. 数组名不能与其它变量名相同。
  4. 方括号中常量表达式表示数组元素的个数,如a[5]表示数组a有5个元素。但是其下标从0开始计算。因此5个元素分别为a[0], a[1], a[2], a[3], a[4]。
  5. 不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。
  6. 允许在同一个类型说明中,说明多个数组和多个变量。


四、函数

无参函数定义的一般形式如下:

类型标识符  函数名()

{

声明部分

语句

}

其中类型标识符和函数名称为函数头。类型标识符指明了本函数的类型,函数的类型实际上是函数返回值的类型。该类型标识符与前面介绍的各种说明符相同。函数名是由用户定义的标识符,函数名后有一个空括号,其中无参数,但括号不可少。

有参函数定义的一般形式如下:

类型标识符  函数名(形式参数表列){

声明部分

语句

}

有参函数比无参函数多了一个内容,即形式参数表列。在形参表中给出的参数称为形式参数,它们可以是各种类型的变量,各参数之间用逗号间隔。在进行函数调用时,主调函数将赋予这些形式参数实际的值。形参既然是变量,必须在形参表中给出形参的类型说明。

形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。

实参出现在主调函数中,进入被调函数后,实参变量也不能使用。形参和实参的功能是作数据传送。发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。

函数的形参和实参具有以下特点:

  • 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。 
  • 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。 
  • 实参和形参在数量上,类型上,顺序上应严格一致,否则会发生“类型不匹配”的错误。 
0 0