【C语言】关键字以及错题

部分C语言关键字以及错题


1.const


意义:

**它限定一个变量不允许被改变,产生静态作用。使用const在一定程度上可以提高程序的安全性和可靠性。 **


下面我们来看看错题

下列三段代码效果一样?

int b;
1)const int *a = &b;
2)int const *a = &b;
3)int *const a = &b;

乍一看,组成这三段代码的元素都是一样的,分别是

  1. const

  2. int

但是他们排列的顺序都各不相同,组合的不同也代表着意义的不同,效果的不同

先看1):const 在 * 的左边,这就规定了a的值不可由地址的改变而发生变化

再看2):和1)一样,const 在 * 的左边

看看3):const 在 * 的右边,表明了指针的指向不变

答案显而易见,1)和 2)效果一样

对于 const 与 * ,总结一下:const 在 * 左,定向 ; const 在 * 右,定值。


2.static


意义:

声明静态变量

听起来很玄乎是不是?为啥声明?静态变量是啥?

在程序执行前系统就为之静态分配分配(也即在运行时中不再改变分配情况)存储空间的一类变量

还不清楚?来看看题目吧。


int f(int n)
{
    static int i = 1;
    if(n >= 5)
    	return n;
    n = n + i;
    i++;
    return f(n);
}

上述函数 f(1) 的值为?

由于 static 的出现,i 的生命发生了天翻地覆的变化:它的生命周期不再像简单的 int i 一样,它的地址从一开始就被分配,并且在函数运行结束之前都不会改变,这代表什么?在这个特定的地址上,每次 i++ 都会使 i 的值加1。不难得出,这题的答案是7.

答案不是最重要的,重要的是 static 声明静态变量的作用。


3.sizeof


意义:

计算数据类型或变量长度(即所占字节数)


sizeof 的运用较简单,但是也不乏有意思的题目

#include<stdio.h>
int main()
{
	int i = 1;
	sizeof(i++);
	printf("%d\n",i);
    return 0;
}

看起来很简洁,但是又一看,有点怪,sizeof(i++) ?

sizeof 是一个编译阶段就执行的运算符,在其内的任何运算都不执行。

所以这题的答案是1

不要想太多,当然也不能不知道这个知识点就瞎蒙答案。

我们再看一道题:

#include<stdio.h>
int i;
int main()
{
	i--;
	if(i < sizeof(i))
	{
		printf(">/n");
	}
	else
		printf("</n");
	return 0;
}

这段代码的运行结果是?

首先,注意 int i; ,这是个未初始化的全局变量,所以它默认为0.

然后就到了重点,if(i < sizeof(i)) 中,sizeof() 的返回值是 unsigned int 也就是无符号整型,在作比较的同时,编译器也会自动将左侧的 i转化为无符号整型,由于默认为0,所以 i--i的值为-1

0 : 00000000 00000000 00000000 00000000
-1 : 11111111 11111111 11111111 11111111 

可见,-1对应的无符号整型是很大很大的数字,自然,这道题的答案是 >


4.unsigned


意义:

**在默认情况下声明的整型变量都是有符号的类型( char 有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned。 **

**unsigned **能存储的数据范围则是0~65535(这个最高位不用做符号位,所以是2的16次方,一共65536)。由于在计算机中,整数是以 补码 形式存放的。根据最高位的不同,如果是1,有符号数的话就是负数;如果是无符号数,则都解释为正数


关于 unsigned ,绕人的题目也不少:

#include<stdio.h>
int i;
int main()
{
	i--;
	if(i < sizeof(i))
	{
		printf(">/n");
	}
	else
		printf("</n");
	return 0;
}

没错,和上边 sizeof()的题一样,再强调一次加深印象。


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值