C语言中几个面试常见的关键字

22 篇文章 0 订阅


①const关键字
★在C语言中,const修饰一个标识符的时候,这个标识符依然是个变量,但是这个变量不能被直接修改,所以它具有常属性。
请看下面的例子:
#include<stdio.h>

int main()
{
    int num1 = 0; 
    const num2 = 0;
    num1 = 10;
    num2 = 10;
    return 0;
}//num1和num2是否可以被修改?

在上边的例子中,num1是一个整型变量,修改它的值是没有问题的,但是num2是const修饰的变量,它具有常属性,不能被修改。const修饰的变量不能被修改,那它是不是常量呢?请看下面的例子。

#include<stdio.h>

int main()
{
   const int sz = 10;
   int arr1[10];
   int arr2[sz];
   return 0;
}//请将这段代码在环境里编译一下,看它是否能通过。

事实上,这段代码是错误的。const修饰的变量只是一个具有常属性的变量,而不是常量,所以 int arr2[sz];是编译不了的。

区别:在C++中,const修饰的变量就是一个常量。请看下面的代码:
//test.cpp
#include<stdio.h>

int main()
{
   const int sz=20;
   int arr1[20];
   int arr2[sz];
   return 0;
}//这段代码可以编译成功吗?

这段代码是正确的,因为在C++中,const修饰的变量就是常量。

②typedef关键字

这个关键字的作用是类型重命名,举一个很形象的例子:假如你叫张三,然后你的家人为了简便,把你叫作小三。请看下面的例子:

#include<stdio.h>

typedef  unsigned int  UINT
int main()
{
     unsigned int num1=0;
     UINT  num2=0;
     return 0;
}

在上边的代码中,num1和num2的类型是一样的,UINT是unsigned int 的别名。当然,在C语言中,还可以用#define重命名。例如:#define UINT  unsigned int .

③register关键字

#include<stdio.h>

int main()
{
    register int a=0;
    //建议编译器把变量a存为寄存器变量
    return 0;
}

如果一个变量很重要,出现次数很多,编译器会建议把这个变量存为寄存器变量。

④volatile关键字

volatile关键字的作用是保证内存的可见性,请看下面的例子:
#include<stdio.h>

int main()
{
    const int num = 10;//const修饰的常变量
    int *p=(int*)&num;
    *p=20;
    //通过指针修改const修饰常变量的值
    return 0;
}

上边的代码在C语言中,变量的值可以被改成20,但是在C++中,num的值还是20。因为在C++中,编译器会对代码进行优化,将const修饰的变量放在寄存器中,运行代码的时候回直接从寄存器中拿,num虽然被修改了,但它的值仍然是10。volatile关键字的作用是防止编译器对代码进行优化,直接从内存里拿,保证内存的可见性。请看下面的代码:

//test.cpp
#include<stdio.h>

int main()
{
    volatile const int num = 10;//防止编译器对代码进行优化
    int *p=(int*)&num;
    *p=20;
    //通过指针修改const修饰常变量的值
    return 0;
}

⑤static关键字
请看一下例子的输出结果是什么?
#include<stdio.h> 
void test()
{ 
   int num=0; 
   num++; 
   printf("%d\n",num);
}

int main()
{ 
    int i=0; 
    for(i=0;i<10;i++)
     { 
       test();
     } 
 return 0;
}

上面代码的输出结果为1 1 1 1 1 1 1 1 1 1,但是如果test函数中的num被static修饰,运行结果将会是什么呢?


#include<stdio.h> 
void test()
{ 
   static int num=0; 
   num++; 
   printf("%d\n",num);
}

int main()
{ 
    int i=0; 
    for(i=0;i<10;i++)
     { 
       test();
     } 
 return 0;
}

这段代码的运行结果为1 2 3 4 5 6 7 8 9 10,请自行动手编译一下代码。

static关键字修饰的局部变量改变了变量的生命周期,使得变量的生命周期变为整个程序,每次的数据都不销毁,所以第二段代码的运行结果发生改变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值