C语言复习一----关键字

1.定义、声明

所谓定义就是编译器创造一个对象,为这个对象分配一块内存并给他取上一个名字
这个名字就是我们所谓的变量名或对象名。
一个变量或对象在一定的区域(函数内、全局)只能被定义一次,多次,编译器就提示你重复定义。

声明有两重含义:
第一重就是告诉编译器,这个名字已经匹配带一块内存上了,下面的代码用的变量或对象是在别的地方定义的
第二重就是告诉编译器,这个名字已经先预定了,别的地方再也不能用做变量名或对象名
例子
A)int i;
B)extern int i;
A是定义 B是声明
区别就是定义为对象创造分配了内存,声明没有分配内存;

2.最快的关键字 register 

请求编译器尽可能的将变量存在CPU的内部的寄存器中;

register 修饰的限制,register变量必须是能被cpu寄存器所接受的类型;
register 变量必须是一个单个的值,并且其长度应小于或等于整型的长度;
而且register变量可能不存在内存中所以不能用取地址运算符"&"

3.static

第一个作用 修饰变量,变量分为局部和全局变量,但他们都存在内存的静态区

静态全局变量,作用域 仅限于被定义的文件中(定义开始处到文件结尾),其他文件即使用extern 声明也无法使用
静态局部变量,在函数体里定义,就只能在这个函数里用,同一个文件其他函数不能用
由于被static 修饰的变量中是在内存的静态区,所以即使这个函数结束,这个静态变量也不被释放掉,函数下次使用时仍然能用到这个值
内存的静态区  ?
#include <stdio.h>
#include <stdlib.h>
static int i = 0;
void fun1()
{
static int j = 0;
j++;
printf("j = %d\n",j);
}

void fun2()
{
i++;
printf(" i = %d\n",i);
}
int main()
{
int k;
for( k = 0 ; k < 10 ; k++)
{
fun1();
fun2();
}
//printf("%d\t%d\n",i,j);
return 0;
}


i 和 j 结果都是10
如过去都去掉 static i= 10 j = 1;


第二个作用修饰函数

使函数成为静态函数 不是指存储方式,而是指对函数的作用域尽限于本文件(内部函数)

好处:不同人编写的不同的函数时不用担心自己定义的函数,是否与其他文件中的韩式同名


4.基本数据类型---short、int、long、char、float、double

6个关键字代表6中基本数据类型
定义变量同时千万千万别忘了初始化。定义变量时编译器并不一定清空了这块内存。他的值可能是无效数据


不同类型之间的运算一般是低精度数据向高精度数据扩展。




5、sizeof不是函数是关键字



sizeof (int)*p表示什么意思   结果为4
sizeof (char)*p              结果为1
sizeof (char*)p              结果为4  


(int)*p 是指强制转换*p指向的变量为int


6.singed unsigned

32位的singed int 范围 -2 31 - 2 31 - 1
32位的unsinged int 范围 0 - 2 32 - 1
编译器缺省是singed
题目
int main()
{
char a[1000];
int i ;
for ( i=0; i<1000; i++ )
{
a[i] = -1 -i;
}
printf("%d",strlen(a) );
return 0;
}

结果答案是255

按照负数补码的规则,可以知道-1 的补码为0xff,-2 的补码为0xfe……当 i 的值为127
时,a[127]的值为-128,而-128是char类型数据能表示的最小的负数。当 i继续增加,a[128]
的值肯定不能是-129。因为这时候发生了溢出,-129 需要 9 位才能存储下来,而 char类型
数据只有 8 位,所以最高位被丢弃。剩下的 8 位是原来 9 位补码的低 8 位的值,即 0x7f。
当 i 继续增加到255的时候,-256的补码的低 8位为 0。然后当i增加到 256时,-257的补
码的低 8 位全为1,即低八位的补码为 0xff,如此又开始一轮新的循环……
按照上面的分析,a[0]到 a[254]里面的值都不为 0,而 a[255]的值为 0。strlen函数是计
算字符串长度的,并不包含字符串最后的‘\0’ 。而判断一个字符串是否结束的标志就是看
是否遇到‘\0’ 。如果遇到‘\0’ ,则认为本字符串结束。

问题;

1) ,按照我们上面的解释,那-0 和+0在内存里面分别怎么存储?
2) ,int i = -20;
unsigned j = 10;

i+j的值为多少?为什么?


3) , 下面的代码有什么问题?
unsigned i ;
for (i=9;i>=0;i--)
{
printf("%u\n",i);
}
死循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值