可见性和生存期、“++”和“--”运算符、关键字(C)

两个凡是:凡是在函数内部定义的变量存储在栈(.stack)区(加static除外),凡是定义在函数外部的变量存储在数据(.date)区。

1.可见性(作用域):

指标识符能够被使用的范围;只有在作用域内此标识符才能被使用,此阶段针对编译和链接过程;

  1).函数中定义的标识符,包括形参和函数体中局部变量,作用域在该函数内,也叫函数域;

  2).文件作用域也称全局作用域,定义在所有函数之外的标识符,具有文件作用域 ,作用域从定义到整个源文件结束,文件中定义的全局变量和函数都具有文件作用域;

2.生存期:

指标识符从程序开始运行时被创建,具有存储空间,到程序运行结束时消亡,释放存储空间,此阶段针对程序执行过程;

  1).局部变量生存期,函数被调用,分配存储空间,函数执行结束后释放空间,存储于栈区;

  2).全局变量生存期,从程序执行开始到结束,存储在数据区;

  3).动态生存期暂不介绍;

3.“++”运算符

上篇博客简单介绍了取模运算符%和它的主要作用,又介绍了用辗转相除法求两个整数的最大公约数,今天来说一下“++”运算符,在这之前先说名一下几个概念:

操作数、左值和右值

a.操作数是程序操纵的数据实体,该数据可以是数值,逻辑值等,可以是常量也可以是变量;

b.左值可写,就是可以对其进行赋值,右值可读,不能对其赋值,但是可以读取它的值;

  • 前置++:c=++a,先给变量a的值加1,再赋值给c,若a赋初值为0,则执行此语句后c的值为1,a的值也变为1;
  • 后置++:c=a++,先将变量a的值赋给c,然后a的值再加1,若a赋初值为0,则执行此语句后c的值为0,a的值变为1;

拿例子说话:

#include<stdio.h>
int main()
{
    int a=0,b=0,c1=10,c2=10;
    c1=++a;
    printf("c1=%d\n",c1);
    c2=a++;
    printf("c2=%d\n",c2);
    return 0;
}

 注:“--”同“++”;

4.关键字

在c语言中,公有32个关键字,根据关键字的作用可分为数据类型的关键字和控制语句关键字。

  1. 数据类型关键字:void   char   short   int   long   float   double   signed   unsigned   truct   union   enum   typedef   sizeof    auto   static   register    extern   const    volatile  
  2. 流程控制关键字:if   else   switch   case   default    for   do   while   return   continue   break    goto  
  3. C19新增关键字:inline   restrict    Bool   Complex   Imaginary

在这里将主要介绍一下标红的关键字typedef    static   sizeof    extern    const  

  • sizeof:计算类型大小或变量的大小,就是字节个数;
#include<stdio.h>
int main()
{
    printf("char :%d\n",sizeof(char));
    printf("int :%d\n",sizeof(int));
    printf("short :%d\n",sizeof(short));
    printf("double :%d\n",sizeof(double));
    printf("float :%d\n",sizeof(float));
    return 0;
}

 

  • typedef:在计算机编程语言中用来为复杂的声明定义简单的别名,本身是一种关键字,与aut、extern、mutable、static、register等关键字不能出现在同一表达式中。
#include<stdio.h>
typedef  unsigned  char   uc;
typedef  unsigned  int  ui;
typedef  unsigned  long long   ull;
typedef  int*   ti;
int main()
{
    uc  a='a';                      //等价于unsigned  char  a='a';
    ui  b=1;                        //等价于unsigned  int  b=1;
    ull  c=5;                       //等价于unsigned  long  long  c=5;
    ti   d;                         //等价于int * d;
}
  • extern:用于全局变量或函数的声明前,用来说明“此变量/函数已在别处定义,要在此处引用”。

text1.cpp                         //此程序没有实际意义,只用来说明extern
#include<stdio.h>
int c=0;
void fun(int a,int b)
{
     int c=a>b?a:b;
     return c;
}
text2.cpp
#include<stdio.h>
extern int c;
extern void fun();
int main()
{
    printf("c=%d\n",c);            //之前已用extern声明,可在此处直接调用c;
    int d=5;int e=23;
    int max1=fun(d,e);             //之前已用extern声明,可在此处直接调用fun();
    printf("max2=%d\n",max2);
}
  • static:可修饰全局变量、局部变量、函数。

局部变量前加static改变生存期(由栈区变为数据区),不改变其可见性(本身只在本文件中可见),全局变量前加static改变可见性(加static后只在本文件中可见),不改变其生存期(仍在数据区);函数前加static后不能用extern在另一文件中调用;

text1.cpp
#include<stdio.h>
static int a=10;                    //静态全局变量
int b=5;                            //全局变量
void fun1()                          //函数
{
    printf("a=%d\nb=%d\n",a,b);
}
static void fun1()                   //静态函数
{
    printf("a=%d\nb=%d\n",a,b);
}
text2.cpp
#include<stdio.h>
extern int a;                  //error
extern int b;
extern void fun1();
extern void fun2();            //error
int main()
{
    printf("a=%d\n",a);        //error
    printf("b=%d\n",b);        //正确
    fun1();
    fun2();                    //error
    return 0;
}
  • const:此关键字在c中用的较频繁,是定义只读变量的关键字,变量名前加const后可读不可写;可修饰变量、指针、数组;加const时一定要给变量初始化赋值,负责将出错,例:const int a=0;如果此时不给a赋值,则出错,因为加const之后a可读不可写不能再次被赋值;

注意:const int a=0;和int const a=0;是等价的。

#include<stdio.h>
const int a=0;
const int b;                         //error 
int main()
{
    const char c='a';
    const int ar[5]={1,2,3,4,5};
    const int br[5]={1,2,3};         //error
    const int cr[5]={};              //正确,都赋初值为0;
    return 0;
}

 

持续更新中……

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值