c语言基础小结(未完)

本文详细介绍了C语言的基础内容,包括数据类型及其关键字、存储相关概念、运算符分类及优先级、控制语句如if、for和switch,以及数组的定义、分类、初始化和引用方法,帮助读者理解和掌握C语言的基本要素。
摘要由CSDN通过智能技术生成

一、数据类型及语句

1.关键字

数据类型相关的关键字

char:字符型,变量占1个字节

 char ch = 'a';
 char ch = '1';
 char ch = ' 123' // (错误)  

可以用ASCII码输入

char ch;
ch = 'a';
ch = 97;

输出:

printf ("%c\n",ch);

short:短整型,变量占2个字节,可表示-32768——32767
int:整型,变量在32位系统下占4个字节,在16平台下占2个字节
long:长整型,变量在32位系统下占4个字节
float:单浮点型,变量占4个字节

float a = 3.8f;

double:双浮点型,变量占8个字节

double a = 5.6;

struct:结构体相关关键字,可以用来定义结构体
union:共用体(联合体)相关关键字
enum:枚举类型相关关键字
signed:表示char,short,int,long数据有符号

signed int a = -6;

unsigned:表示无符号,只能保存正数和零

unsigned int a = 101;
unsigned int a = -101;//(错误)

void:空类型的关键字,用来修饰函数的参数或者返回值,代表函数没有参数或者返回值

void fun(void)
{
}//fun函数没有返回值,没有参数

存储相关关键字

register:寄存器,修饰寄存器变量
1,变量不一定真的放在寄存器中
2,cpu取数据时从寄存器中取比去内存中取要快
3,寄存器数组比较宝贵,不能定义寄存器数组
4,只能修饰字符型和整型,不能修饰浮点型
5,只有存放在内存中的数据才有地址,所以不能对寄存器变量取地址
static:可以修饰全局变量,局部变量,函数
const:常量,修饰的变量是只读的,不能修改值
auto
extern:一般用于函数和全局变量的声明

控制语句相关的关键字

if,else,break,continue,for,while,do,switch,case,goto,default

其他的关键字

sizeof:用来测量变量、数组的占用存储空间的大小
typedef:重命名相关

typedef short int INT16;
int main()
{
	INT16 c = 111;
	printf("%d",c);
	return 0;
}

volatile:告诉cpu每次用volatile变量时,重新去内存中取一份,保证用的是最新的值而不是寄存器中的备份

2. 数据类型

基本类型

如char,short int,int,ong int,float,double
常量:值不可以改变
变量:值可以改变
字符数据
字符常量:
(1)直接常量:如:‘a’, ‘b’, ‘0’
(2)转义字符:以反斜杠”\“开头,后跟一个或几个字符,如"\n"(换行), “\r”(横向跳格)等
字符变量:
用char定义,每个字符变量被分配一个字节的内存空间,字符值以ASCII码的形式存放在变量的内存单元中
整型数据
整型常量(按进制分):
(1)十进制
(2)八进制:以数字0开头,如0123(逢8进1)
(3)十六进制:以0x开头,如0x1e(a = 10, b = 11, c = 12, d = 13, e = 14, f = 15)
整型变量:
(1)有/无符号短整型(un/signed)short (int)2个字节
(2)有/无符号基本整型(un/signed)int 4个字节
(3)有/无符号长整型(un/signed)long (int) 个字节
实型数据(浮点型)
实型常量:也称实数或浮点数,不以f结尾的常量是double类型,以f结尾的是float类型
(1)十进制形式:由数字和小数点组成,如0.0,0.12,5.0
(2)指数形式:ae3:a10^3 ,123e-3:12310^-3
实型变量:
(1)float:占4个字节,7位有效数字,指数-37到38
(2)double:占8个字节,16位有效数字,指数-307到308
格式化输出字符

符号含义
%d十进制有符号整数
%u十进制无符号整数
%x以十六进制表示的整数
%o以八进制表示的整数
%ffloat型浮点数
%lfdouble型浮点数
%e指数形式的浮点数
%s字符串
%c单个字符
%p指针的值

特殊应用
%3d:要求宽度为3位,若不足三位,前面空格补齐,若超过3位,此语句无效,下同
%03d:要求宽度为3位,若不足三位,前面0补齐
%-3d:要求宽度为3位,若不足三位,后面空格补齐
%2f:小数点后只保留2位
%5.2f:占5个位置,小数点后有两个

构造类型

概念:由若干个相同或不同类型数据构成的集合,这种数据类型称为构造类型,如int a[10];
数组,结构体,共用体,枚举都属于构造类型

类型转换

转换方式
(1)自动转换:
原则:
占用字节数少的像占用字节数多的类型转换,以保证精度不降低:
当表达式中出现了char,short,int类型中的一种或多种,没有其他类型了,参加运算的成员全部变成int型,结果也是int类型;
当表达式中出现了带小数点的实数,参加运算的成员全部变成double类型的参加运算,结果也是double类型;
当表达式中有有符号数,也有无符号数,参加运算的成员变成无符号数,运算结果也是无符号数
转换方向:
在赋值语句中,等号右边的类型自动转换为等号左边的类型

int a;
float f = 5.8f;
a = f;
printf ("%d",a);//输出时a=5

(2)强制类型转换:
把表达式的结果强制转换成类型说明符所表示的类型
写法:(类型说明符)(表达式)

(float)a;//把a的值转换成实型
(int)(x + y);//把x+y的结果值转换为整型

3. 运算符

运算符

用算术运算符将运算对象连接起来,符合C语法规则的式子,称为C算术表达式,运算对象包括常量、变量、函数等

a * b / c - 1.5 + 'a'

运算符的分类

双目运算符:参加运算的操作数有两个,如a+b
单目运算符:参加运算的操作数只有一个,如自增运算符++,自减运算符–,a++
三目运算符:参加运算的操作数有三个,如条件运算符()?():()

算数运算符

:+、-、* 、 / 、%(取余) += 、-= 、*= 、 /= 、%=
其中复合运算符 a += 3相当于a = a + 3

关系运算符

:>、<、==、>=、<=、!=(不等于)
一般用于判断条件是否满足或循环语句

逻辑运算符

&& :逻辑与,两个条件都为真,则结果为真

if ((a > b) && (a < c))
if (b < a < c)//(错误)

||:逻辑或,两个条件至少有一个条件为真,则结果为真
:逻辑非,if (! (a > b)):a > b为假时,!(a > b)为真

位运算符

十进制转二进制:除2求余法

在这里插入图片描述
原码、反码、补码
正数在内存中以原码形式存放,负数在内存中以补码形式存放
正数有:原码=反码=补码
原码:将一个整数转换成二进制就是其原码。如5的原码为0000 0101,-5的原码为1000 0101(最高位为符号位)
反码:正数的反码就是其原码,负数的反码是将其原码中除符号位以外,每一位取反。如5的反码为0000 0101,-5的反码为1111 1010
补码:正数的补码就是其原码,负数的补码就是反码+1。如5的补码为0000 0101,-5的补码为1111 1011
位运算
无论是正数还是负数,编译系统都是按照内存中存储的内容进行位运算
& 按位与:任何值与0得0,与1不变(只有1&1得1)。如0101 1011 & 1011 0100 = 0001 0000
| 按位或:任何值或1得1,或0不变(只有0|0得0)。如0101 0011 | 1011 0100 = 1111 0111
~ 按位取反:0变1,1变0。如0101 1101 ~ = 1010 0010
^ 按位异或:相异得1,相同得0。如1001 1100 ^ 0101 1010 = 1100 0110
位移(逻辑,算数):>>:右移;<<:左移
逻辑位移:低位溢出,高位补0。如逻辑右移0101 1010 >> 3 = 0000 1011
算数位移:对有符号数来说,低位溢出,高位补符号位。如算数右移1010 1101 >> 3 = 1111 0101;0101 0011 >> 3 = 0000 1010

条件运算符

(A) ? (B) : (C):若A成立,则B,否则C

逗号运算符,自增自减运算符

() , ():逗号运算符,结果是后边表达式的结果
如num = (5 , 6); 即num = 6;
i ++,i --:自增自减运算符。运算符在变量后面,在当前表达式中先用i的值,下条语句时i的值改变
++ i, – i:先加/减,后用

int i = 3;
num = i ++;//num = 3,i = 4
num = ++ i;//num = 4,i = 4

扩展

int i = 3;
int num;
num = (i ++ ) + (i ++ ) + (i ++ );//这种情况先用i,再算num,得i = 3,num = 9,之后再算i 自增,i = 6
num = (++ i ) + (++ i ) + (++ i );//这种情况先算i,再算num,得i = 6,num = 18.但这种情况时不同编译器结果不同,在Linux中结果是i = 6,num = 16

运算符优先级和结合性

在表达式中,按照优先级先后进行运算,优先级高的先于优先级低的,优先级一样的按结合性来运算

4、控制语句相关关键字

选择控制语句

if

if(){ 
}
else if(){
}
……
else {
}

switch

switch(){
case 1:
	break;
……
default:
	break;
}

case会从上往下依次执行,直到遇到break

循环控制语句

for

for (A ; B ; C){
//复合语句,循环体
}//第一次循环时执行A,A只执行一次;
//B是循环的条件,B为真执行循环;
//C:执行完循环体后再执行C

顺序:A -> B(判断) -> 循环体 -> C -> B -> 循环体 -> C -> ……
break:结束循环
continue:跳过此次循环,继续下一次循环
while

while(A){//A:条件,A为真时进行循环
//循环体
}

do while

do{
//循环体
} while (A)//A:条件

goto

goto A;
A://A:标签

二、数组

1、数组的概念

数组是若干个相同类型的变量在内存中有序存储的集合
数组的下标是从0开始的

2、数组的分类

按元素类型分类

字符数组:数组中每个元素都是字符型的。如char s[10];
短整型数组:short int a[10];
整型数组:int a[10];
长整型数组:long int a[10];
浮点型数组:float a[10]; double a[10];
指针数组:char *a[10]; int *a[10];
结构体数组:struct stu boy[10];

按维数分类

一维数组:int a[10];
二维数组:int a[10][10];
多维数组:int a[10][10][10];

3、数组的定义

一维数组的定义:可以不给出个数,如int a[] = {……};
多维数组的定义:可以不给出行数,但必须给出列数。如int a[][3] = {{1,2,3} {1,2,3}{1,2,3}……};

4、数组的初始化

定义数组的时候,顺便给数组的元素赋初值

一维数组的初始化

全部初始化:int a[5] = {1,2,3,4,5};:a[0] = 1,a[1] = 2……
部分初始化:int a[5] = {1,2,3};:初始化赋值 不够后面补0

二维数组的初始化

按行初始化
全部初始化:
int a[2][2] = {{1,2} , {4,5}};
a[0][0] = 1; a[0][1] = 2; a[1][0] = 4;a[1][1] = 5;
部分初始化:
int a[3][3] = {{1,2} , {1}};
a[0][0] = 1;a[0][2] = 0;
逐个初始化
全部初始化:int a [2][3] = {2, 5, 4, 2, 3, 4};
部分初始化:int a [2][3] = {2, 5, 4, 2};

5、数组元素的引用

一维数组元素的引用方法

数组名[下标];
下标代表数组元素在数组中的位置,从0开始

二维数组元素的引用方法

数组名[行下标][列下标];

字符数组

char c1[] = { ‘c’ , ’ ‘, ‘s’ , ‘d’ , ‘r’ , ‘j’ };
char c2[] = “c sdrj”;//字符串数组结尾会有\0
char a[][6] = { “hello” , “world”};
用字符串方式赋值比用字符逐个赋值要多1个字节,用于存放字符串结束标志‘\0’

demo

1111

  • 11111
    • 2222

ssssss
sssssssssss
ssssssssssss

11111
  1. wwwww
  2. www
  3. wwww

1111

  • 11111
    • 2222
      • 333

ssssss
sssssssssss
ssssssssssss

1111 1
  1. wwwww
  2. www
  3. wwww
  • 20
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值