C语言(指针之前的所有知识点)

变量与类型:  

不同类型的变量相互赋值,仅仅改变类型,而不改变原变量的数值
示例:
double a = 2;就是int类型的2转变成double类型的2.0后赋值给a
int a = 3.14;就是float类型的3.14转变成int类型的3后赋值给a
浮点数的除法与数学中的除法相同,结果为浮点数
浮点数不能进行取余运算与位运算

常见数据类型的取值范围:

要注意的是float和int一样占用4个字节,double占用8个字节

只有类型定义的变量才会占用内存,类型并不会占用内存,类型只会决定这个变量能占用多少内存

long类型:

逻辑运算:

示例1:
int a = 1;
int b = 0;
int c = a == b;
答案:c = 0,因为a == b这个逻辑表达式为假,也就是0

运算优先级:


示例2:
int a = 1;
int b = 2;
int c = 0;
c = a < b + c < b;
答案:c = 1,因为四则运算(+-*/)的优先级大于关系运算的优先级,得到:1<2<2,且逻辑运算从左往右依次进行,所以c=1
若c = (a < b) + (c < b);
则c=2,因为括号可以改变优先级

非0即真:

逻辑运算中的短路法则:

“&&”的左边若为假(0),则停止运算,因为0与任何数都为0;“||”左边若为真(1),则停止运算,因为1或任何数都为1

位运算:

几种常见的位运算:

不同类型的变量进行为运算时要先补符号位(符号位为0还是1要看是正数还是负数,正数补0,负数补1)

 位运算要注意的事:

示例1:
short a = 1;
int b = 4;
int c = a | b;
答案:c=5,解析:a是两个字节的正数,最高位是1,低一位是补0,所以就是01,b是四个字节的正数,最高位是4,低三位补0,所以就是0004,然后a进行补符号位后变为0001,0001或0004后,得0005,所以c为5
示例2:
c = -1 >> 4;
答案:c=-1,解析:-1是四个字节,最高位是1,低三位补1,所以就是1111,1111 >> 4后把低四位移走,高四位要补符号位,而负数的符号位是1,所以结果还是1111也就是-1,所以c=-1

结论:
整数右移x位就是除2的x次方,左移x位就是乘2的x次方
示例:
0x40转换成二进制是01000000,转换成十进制就是64,因为1左移6位就是乘2的6次方

char的特殊用法:

从第10课第二小节第7分钟开始看

 

switch语句:

switch括号里的值只能为整数或整形变量

switch示例:

switch合并条件示例:

do...while语句:


 

break语句:

break示例:

解析:case0的break会与最近的for匹配,因为case0的for已经被case0的break匹配,所以case1的break不需要再匹配case0的for,如果case0没有break,那case1的break就会匹配case0的for 

continue语句:

unsigned与signed,超出取值范围会怎样?:

最大值+1回转到最小值,最小值-1回转到最大值

unsigned与signed对应的类型所占用的字节是一样的,不一样的仅仅是它们的最大值和最小值

示例1:

short a = 32767;

int b = 2147483647;

short c = -32768;

int d = -2147483647;

a + 1 = -32768;

b + 1 = -2147483647;

c -1 = 32767;

d - 1 = 2147483647;

示例2:

char a = 128;

unsigned char b = 128;

答案:a = -128, b = 128。解析:char的取值范围为-128~127,unsigned char的取值范围为0~255

示例3:

如果a的取值范围是0~3,那么a = 4时,得到的a应该等于0

sizeof:

两种特殊表达式:

三目运算符

 逗号表达式:

 

自增与自减:

自增或自减的结合方向是从右至左,且自增和自减不支持浮点类型
示例1:
int c = 1;
-c++
答案:c=-1,解析:先进行c++得到c=1,再把c++的结果与负号结合
示例2:
int a = 0;
int c = 1;
a = -c++;
printf("a = %d\n",a);
a = +++c;
printf("a = %d\n",a);
答案:第一个printf打印的a是-1;第二个printf打印的a是3,因为c++后c是2,++c后c是3,++c前面还有一个”+“号,所以是正的++c,也就是+3,所以a是3
 

常量的关键字:

define与enum:

enum的用法:

enum的补充:

1:enum枚举类型创建的变量就是整形变量,enum枚举类型也是整形
示例:
enum Day
{
    Mon = 1;
    Tus;
    Wen;
};
enum Day a;
sizeof(enum Day) = 4
sizeof(a) = 4
2:由枚举类型定义的变量只能赋予枚举列表里的值
示例:
enum Day
{
    Mon = 1;
    Tus;
    Wen;
};
enum Day a = Tus是对的
enum Day b = 5是错的
enum Day c = Fri也是错的
3:enum也可以单独定义常量
示例:
enum{a = 1};
printf("%d\n",a);
可以打印得1,且a = 2这个做法是错的,因为a是常量不是变量

const:

可以把一个变量变成可读的性质,防止其它人更改你的变量

const用来修饰变量,使变量的性质变为只读,被修饰的变量的本质永远都是变量,只不过用法像常量
被const修饰的变量无法通过直接赋值的方式改变它的值,但可以间接改变它的值;而define与enum定义的常量不管是直接还是间接都无法改变它的值

 

数组:

数组的注意事项:

数组中的某个或多个元素如果没有被赋予初始值,系统会自动将其赋值为0
数组的大小只能用常量声明而不能用变量声明

示例:
int size = 4;
a[size] = {0,1,2,3};
上面这样写是错误的,因为size是变量

数组的类型:

数组(一维和二维)的类型由数组中元素的类型和数组的大小两部分组成,缺一不可
示例:
int a[4];
所以一维数组a的类型是int[4] 

计算数组的大小:

字符串:

字符数组:

0元素:

字符串函数:

补充:strcpy(s1,s2)函数的作用是先把s1里的内容清空,然后把s2原封不动的复制到s1里 

函数:

函数的定义与声明:

函数的参数:

示例:
void fun1()
{

}

void fun2(void)
{

}

int main(void)
{
    fun1(1,2,3);

    fun2(1,2,3);    

    return 0;
}
答案:fun2(1,2,3)那行会报错,因为void就代表没有参数,不能给它传参;为什么fun1(1,2,3)不会报错,因为“()”里面什么都没有,代表接受任意参数

函数的特殊类型“void”:

 函数中的数组参数:

 函数的返回:

对于没有返回值的函数其实也可以返回主函数:
1:执行到函数的最后一条语句时自动返回到主函数
2:直接调用“return;”这个语句即可立刻返回主函数,要注意的是return后面只能跟一个分号,不能跟某个值

对于有返回值的函数:
函数里的return语句必须能被执行,如果return无法执行,则是错误的,而且return语句必须携带合法的返回值

局部变量与全局变量:

概念:

 局部变量的作用域:

一个代码块就是从“{”开始到“}”结束,一个函数中可以不止一个代码块
示例1:
int main(void)
{
    int a = 1;
    {
        int a = 2;
        printf("%d\n",a);
    }
    printf("%d\n",a)
    return 0;
}
答案:第一个printf打印的是2,第二个printf打印的是1,因为同名的变量采取就近原则,离谁近就调用谁,局部变量的作用域从定义开始到当前代码块结束,且作用域结束后该变量不可以被访问
示例2:
int main(void)
{
    int i = 0;
    while(i < 5)
    {
        int i = 10;
        i++;
    }
    printf("%d\n",i)
    return 0;
}
答案:什么都不会打印出来,程序永远在while循环里死循环。
解析:”i++“的这个i是while循环里定义的i,当它执行到“}”之后就结束了自己的生命周期,不可以再访问它;而每次循环判断“i<5”的i是main函数一开始定义的i,它一直都在自己的作用域里,所以可以一直访问它,所以每次判断的循环条件都是成立的,每次都可以进入while循环,既然可以每次都进入while循环,那么就可以每次都定义”i=10“,然后i++变成11后结束自己的生命周期,再进入下一次while循环,所以就造成了while死循环,并且每次都在while循环里创造一个新的i。
 

全局变量的作用域:

全局变量与静态全局变量的补充:

1:当a文件的变量想要在b文件中使用,那么b文件应该包含a的头文件,并且a的头文件里要用extern声明这个变量,注意:extern声明变量时不需要赋值
2:静态全局变量即使用extern声明也无法在别的文件中使用
3:static也可以修饰函数,使该函数无法在别的文件中调

4:一个程序有可能不止一个文件

5:static修饰的全局变量只能在当前文件中被访问,该程序的其他文件无法访问当前文件的这个全局变量,而没有static修饰的全局变量可以被程序中的所有文件访问。 

static关键字:

注意!!!

当static修饰了一个变量,其它全局变量不允许使用与static修饰的变量名字相同的变量名字

示例:

A文件有一个static int a;

B文件有一个int a

解析:这是错误的,因为全局变量int a的作用域与静态变量static int a的作用域冲突了;如果B文件的int a前面加上static则是正确的,因为两个静态变量互不影响

变量的生命周期和存储区:

不同变量的存储区:

全局数据区的补充:

全局数据区的变量默认初始化为0,这就是为什么定义全局变量时,如果你不给它赋初始值,它能被打印成0。 

 变量的生命周期:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值