不论是使用哪种高级程序语言编写程序,变量都是其程序的基本组成单位,比如:
void main(){
int a = 1;//定义了一个整型变量,取名为a,并赋值为1(强数据类型语言)
int b = 3;//定义了一个整型变量,取名为b,并赋值为3
b = 89;//给变量赋值为89
printf("a=%d\n",a);//使用输出语句,把变量a值输出%d表示输出的形式为整数
printf("b=%d\n",b);//使用输出语句,把变量b值输出%d表示输出的形式为整数
getchar();//将控制台停留,等待输入
}
变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号,通过门牌号我们可以找到房间,而通过变量名可以访问到变量(值)。
1、声明变量 int num;
2、赋值 num=60;
3、使用 printf(“num=%d”,num);
4、也可以一步到位:int num2 = 99;
案列演示
# include
void main(){
int num1 = 1; // 整形
double score = 2.3; // 浮点型
char gender = 'A'; // 字符
char name[] = "尚硅谷"; //字符串
// 说明
// 1.如果输出的整数 %d
// 2.如果输出的是小数 %f.如果希望保留小数点 %.2f
// 3.如果输出的是字符 %c
// 4.如果输出的是字符串 %s
// 5.在输出不同数据时,对应的格式化形式要对应起来
printf("num=%d score=%.2f gender=%c name=%s",num1,score,gender,name);
getchar();
}
1、变量表示内存中的一个存储区域(不同的数据类型,占用的空间大小不一样)
2、该区域有自己的名称和类型
3、变量必须先声明,后使用
4、该区域的数据可以在同一类型范围内不断变化
5、变量在同一个作用域内不能重名
6、变量三要素(变量名+值+数据类型),这一点请大家注意。
7、代码演示
#include
void main(){
//1. 变量必须先声明,后使用
// num = 10; //未定义标识符num
// int num;
// 2.该区域的数据可以在同一类型范围内不断变化
int num = 90;
// 3.变量在同一个作用域不能重名
// 4.变量有三个要素(变量名 num2 变量值 35 数据类型:Int)
int num2 = 35; // num不能重复定义
num = 60;
num = 56;
//num = 3.4; //从double转换成Int,可能丢失数据
printf("num = %d",num);
getchar();
}
1、每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间(使用字节多少表示)。
注意:在c中,没有字符串类型,使用字符数组表示字符串
在不同系统上,部分数据类型字节长度不一样,int 2 或者 4
C语言的整数类型就是用于存放整数值的,比如12,30,3456等等
int num = 10;
1、各种类型的存储大小与操作系统、系统位数和编译器有关,目前通用的以64位系统为主。
2、在实际工作中,c程序通常运行在linux/unix操作系统下.二级考试,使用windows
3、C语言的整型类型,分为有符号signed和无符号unsigned两种,默认是signed
4、C程序中整型常声明为int型,除非不足以表示大数,才使用longlong
5、bit(位):计算机中的最小存储单位。byte(字节):计算机中基本存储单元。
1byte=8bit
示意图
short 3 在内存中占有2字节
int 3 在内存中占有4个字节
C语言的浮点类型可以表示一个小数,比如123.4,7.8,0.12等等
void main(){
double salary = 10000.56;
double num1 = 1.3;
double num2=4.5;
double sum=num1+num2;
printf("sum=%.2f",sum);// 5.80
getchar();
}
1、关于浮点数在机器中存放形式的简单说明,浮点数=符号位+指数位+尾数位,浮点数是近视值
2、尾数部分可能丢失,造成精度损失。
1、浮点型常量默认为double型,声明float型常量时,须后加‘f’或‘F’。2、浮点型常量有两种表示形式
十进制数形式:如:5.12 512.0f .512(必须有小数点)
科学计数法形式:如:5.12e2、5.12E-2
3、通常情况下,应该使用double型,因为它比float型更精确。
4、printf(“d1=%f”,d1);//在输出时,默认保留小数点6位
5、代码
#include
void main(){
// 浮点型常量默认为double,声明float型常量时,须后加'f'或'F'
double d1 = 1.1899259949; //从“double”到“float”截断
float d2 = 1.1f; // 1.1f就是float
double d3 = 1.3; //ok
double d4 = 5.12;
double d5 = .512; // 等价 0.512
double d6 = 5.12e2; // 等价 5.12*(10^2) = 512
double d7 = 5.12e-2; // 等价与5.12*(10^-2)= 5.12 / 100 = 0.0512
// 在输出时,如果%f默认保留小数点6位 double15位
printf("d1=%.15f d2=%f d3=%f d4=%f d5=%f d6=%f d7=%f",d1,d2,d3,d4,d5,d6,d7);
getchar();
}
字符类型可以表示单个字符,字符类型是char,char是1个字节(可以存字母或者数字),多个字符称为字符串,在C语言中使用char数组表示,数组不是基本数据类型,而是构造类型[关于数组我们后面详细讲解.]
void main(){
char c1='A';
char c2='0';
char c3='\t';
printf("c1=%cc3=%cc2=%c",c1,c3,c2);//%c表示以字符的形式输出getchar();
}
1、字符常量是用单引号(’’)括起来的单个字符。例如:char c1=‘a’; char c3=‘9’;
2、C中还允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量。例如:char c3=‘\n’;//’\n’表示换行符
3、在C中,char的本质是一个整数,在输出时,是ASCII码对应的字符。
4、可以直接给char赋一个整数,然后输出时,会按照对应的ASCII字符输出[97]
5、char类型是可以进行运算的,相当于一个整数,因为它都对应有Unicode码.
6、案例演示
#include
void main(){
char c1 ='a';
char c2 ='b';
char c3 =97;
// 这时当我们以%c输出时,就会按照ASCII编码表(理解 字符 <==> 数字)对应的97对应字符输出
// 这里注意
// 1.vs2010 编译器 是c89
// 2.要求 变量的定义在语句之前
int num = c2 +10; // 98 + 10 = 108
printf("c1=%c c2=%c c3=%c\n",c1,c2,c3); // c = 'a'
printf("num = %d",num);
getchar();
}
1、字符型存储到计算机中,需要将字符对应的码值(整数)找出来
存储:字符’a’——>码值(97)——>二进制(1100001)——>存储()
读取:二进制(1100001)——>码值(97)——>字符’a’——>读取(显示)
2、字符和码值的对应关系是通过字符编码表决定的(是规定好)
1、在计算机内部,所有数据都使用二进制表示。每一个二进制位(bit)有0和1两种状态,因此8个二进制位就可以组合出256种状态,这被称为一个字节(byte)。一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。
2、ASCII码:上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码。ASCII码一共规定了127个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。
3、看一个完整的ASCII码表
4、缺点:不能表示所有字符。
1、C语言标准(C89)没有定义布尔类型,所以C语言判断真假时以0为假,非0为真[案例]
2、但这种做法不直观,所以我们可以借助C语言的宏定义。
3、C语言标准(C99)提供了_Bool型,_Bool仍是整数类型,但与一般整型不同的是,_Bool变量只能赋值为0或1,非0的值都会被存储为1,C99还提供了一个头文件
条件控制语句;if
循环控制语句;while…
#include
#define BOOL int
#define TURE 1
#define FALSE 0
void main(){
BOOL isOk = TURE; // 等价 int isOk = 1
int isPass = -1; // 0表示假 , 非0表示真
if(isPass){
printf("通过考试\n");
}
// 可以使用宏定义来完成(这里大家先看下,体会一下,后面我们会详解宏定义)
// 定义一个布尔变量
if(isOk){
printf("ok");
}
getchar();
}
介绍:当C程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数据类型,这个就是自动类型转换。
1、有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度最大的那种数据类型,然后再进行计算(如int型和short型运算时,先把short转成int型后再进行运算)。
2、若两种类型的字节数不同,转换成字节数大的类型,若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型
3、在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边的类型将转换为左边的类型,如果右边变量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入
4、代码演示
#include
void main(){
// 举例1
char c1 = 'a';
int num1 = c1; // ok
double d1 = num1; //ok
//ok
// 举例2
short s1 = 10;
int num2 = 20;
int num3 = s1 + num2 ;
// 举例3
float f1 = 1.1f; //ok
double d2 = 4.58667435;
f1 = d2; // 出现精度损失(double=>float)
printf("f1=%.8f",f1); // 期望: 4.58667435
getchar();
}
将精度高的数据类型转换为精度小的数据类型。使用时要加上强制转换符(),但可能造成精度降低或溢出,格外要注意。
(类型名)表达式
什么是表达式:任何有值都可以称为表达式,比如1+2,int num = 2
这种强制类型转换操作并不改变操作数本身
#include
void main(){
double d1 =1.934;
int num = (int)d1; // 这里注意,不是进行四舍五入,而是直接阶段小数后的部分
// 强制转换只对最近的数有效,如果希望针对更多的表达式转换,使用()
//int num2 = (int)3.5 * 10 + 6*1.5; // 3 * 10 + 6 * 1.5 = 30+9.0 = 39.0 -> 39
int num3 = (int)(3.5 * 10 + 6*1.5); // 35.0 + 9.0 = 44.0 -> 44
printf("\nnum3=%d",num3);
printf("\nnum=%d d1=%f",num,d1); // d1 仍然是double类型
getchar();
}
1、当进行数据的从精度高——>精度低,就需要使用到强制转换
2、强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级
3、案例演示看上面的就ok
判断是编译是否会通过 ?
char c = ‘a’;
int i=5;
float d =.314F;
double result = c+i+d; //c+i+d类型是float->double ok
案例:
#include
void main(){
char c = 'a';
int i = 5;
float d = .314f;
double d2 = 1.0;
//double result = c+i+d; // float -> double
char result = c+i+d; // 提示? float -> char 警告从“float”转换到“char”,可能丢失数据
char result = c+i+d+d2; // 提示? double -> char 警告从“double”转换到“char”,可能丢失数据
}
简单的说 指针表示一个地址(存放的是地址)
举例说明
// 讲解指针的入门
#include
void main(){
int num = 1;
// 定义一个指针变量,指针
//说明
// 1.int *表示类型为 指针类型
// 2.名称ptr ,prt就是一个int * 类型
// 3.ptr指向了一个int类型的变量的地址
int *ptr = #
// num的地址是多少
// 说明1:如果要输出一个变量的地址,使用格式是 %p
// 说明2:&num 表示取出num这个变量对应地址
printf("\nnum的值 =%d num 地址=%p",num,&num);
// 1.指针变量,本身也有地址 &ptr
// 2.指针变量,存放的地址 ptr
// 3.获取指针指向的值 *ptr
printf("\nprt的地址是 %p,ptr存放的值时一个地址 %p, ptr 指向的值=%d",&ptr,ptr,*ptr);
getchar();
}
上面案例对应的内存布局图
写一个程序,获取一个int变量num的地址,并显示到终端将num的地址赋给指针ptr,并通过ptr去修改num的值.并画出案例的内存布局图
案例演示
#include
void main(){
//1.写一个程序,获取一个Int变量的num的地址,并显示到终端
//2.将num的地址赋给指针ptr,并通过ptr去修改num的值
//分析
//ptr的类型 就是 int * ,注意指针的类型和该指针指向的变量类型时对应关系
//3.画出案例的内存布局图
int num = 88;
int *ptr = #
printf("\nnum的值= %d , num的地址%p",num,&num);
*ptr = 99; // 通过ptr去改变num的,num变量的值也就响应的修改
printf("\nnum的值= %d ,num的地址%p",num,&num);*/
int a = 300; //300
int b = 400; //400
int *ptr = &a; // ok ptr的地址指向a变量
*ptr = 100; // a =100
ptr = &b; // ok ptr的地址指向b变量
*ptr = 200; //b=200
printf("a = %d b = %d prt=%d",a,b,*ptr);
getchar();
}
内存布局示意图
1、基本类型,都有对应的指针类型,形式为数据类型*,比如int的对应的指针就是int*,float对应的指针类型就是float*,依次类推。
2、此外还有指向数组的指针、指向结构体的指针,指向共用体的指针,(二级指针,多级指针)后面我们再讲到数组、结构体和共用体时,还会详细讲解
C语言传递参数(或者赋值)可以是值传递(passbyvalue),也可以传递指针(apointerpassedbyvalue),传递指针也叫地址传递。
1、默认传递值的类型:基本数据类型(整型类型、小数类型,字符类型),结构体,共用体。
2、默认传递地址的类似:指针、数组
1、值传递:将变量指向的存储内容,在传递/赋值时,拷贝一份给接收变量.
2、地址传递也叫指针传递:如果是指针,就将指针变量存储的地址,传递给接收变量,如果是数组,就将数组的首地址传递给接收变量。
3、代码演示
#include
void main(){
int num = 100;
int *p = #
int *p2 = p;
*p2 = 55;
printf("\nnum=%d p=%p p2=%p",num,p,p2);
getchar();
}
1、试编写程序实现如下效果
姓名 年龄 成绩 性别 爱好
xx xx xx xx xx
要求:
a、用变量将姓名、年龄、成绩、性别、爱好存储
b、添加适当的注释
c、添加转义字符
#include
void main(){
//
// 1) 试编写程序实现如下效果
// 姓名 年龄 成绩 性别 爱好
// xx xx xx xx xx
// 要求:
// a、用变量将姓名、年龄、成绩、性别、爱好存储
// b、添加适当的注释
// c、添加转义字符
// 分析: 使用不同的变量来保存对应的数据
char name[10] = "张三";
short age = 23;
float score = 78.5f;
char gender = 'M';
char hobby[20] = "篮球,足球";
printf("姓名\t年龄\t成绩\t性别\t爱好\n%s\t%d\t%.2f\t%c\t%s",name,age,score,gender,hobby);
getchar();
}
2、编写如下代码,并看打印效果
# include
void main(){
int number1;
int number2;
int number3;
int number4 = 50;
int number5;
number1=10;
number2=20;
number3=number1+number2;//30
printf("\nNumber3=%d",number3);//30
number5=number4-number3;//20
printf("\nNumber5=%d",number5);//20
getchar();
}
3、实现两个整数的加减乘除以及取余算法
4、判断一个整数是偶数还是奇数,if第3和第4题的答案:
#include
void main(){
//************************
// 小小计算器
//************************
//10 + 5 = 15
//10 - 5 = 5
//10 * 5 = 50
//10 / 5 = 2
//分析
//1.定义两个int
//2.根据要求进行计算,得到不同结果,可以再定义变量
int n1 = 10;
int n2 = 5;
int sum = n1 + n2;
int sub = n1 - n2;
int mul = n1 * n2;
int div = n1 / n2;
int mod = n1 % n2;
int num = 10;
//输出
printf("\n************************");
printf("\n 小小计算器");
printf("\n************************");
printf("\n %d + %d = %d",n1,n2,sum);
printf("\n %d - %d = %d",n1,n2,sub);
printf("\n %d * %d = %d",n1,n2,mul);
printf("\n %d / %d = %d",n1,n2,div);
printf("\n %d 模 %d = %d",n1,n2,mod);
// 判断num 是不是偶数还是奇数
// if-else后面要学习的分支结构,后面还会详解
if(num%2==0){ // 偶数
printf("\n%d是偶数",num);
}else{
printf("\n%d是奇数",num);
}
getchar();
}
5、 总结学过的命令:输入、输出、运算、存储