-
C第一天
今天是C语言的第一天,老师讲的都是一些基础知识,但是要想继续走下去,能够写出命令,这些内容都要掌握。这些内容我是可以写出来,但感觉并不是能写出这些内容就能够依靠他们写出后面的命令。
c语言:一门编程语言
用途:用来编写程序的,即按照我们的意图和想法编写一条条可执行的指令,这些指令在内存中运行得到一个我们想要的结果
程序:是由多条指令集合而成,他们能工作,并能实现一定的功能。
程序的特点:数据结构+算法
数据结构:多数据的描述,即数据以何种形式存在,是计算机操作的对象。
算法:对操作的描述。即对数据的操作步骤。
数据:一切信息都是数据,数据有可变(变量)和不变(常量)之分。
常量:特点
一个整型的表示方法:二进制,八进制,十进制,十六进制
变量:1.取名 2.怎么定义一个变量
基本的数据类型:int short long char float double
标准输入和标准输出:scanf和printf
#include <stdio.h>//以.h为后缀的文件为头文件,c程序的一般函数的定义都在此头文件中
void main()//主函数,整个程序只有一个主函数,它是程序开始执行和结束的地方,void 是函数的返回值类型,void 说明函数没有返回值
{
printf("hello world!\n");
//程序要执行的指令,此处为向屏幕输出双引号中的内容。'\n':换行,指令以';'为结尾
}
编写一个c程序:vim 文件名.c 即打开一个.c为后缀的文件,该文件是用来书写c源程序,写完之后:wq保存退出。
编译:gcc 文件.c 若文件源程序有语法错误,在次步骤就会报错,修改完成后编译成功就会生成计算机可直接执行的二进制文件a.out
运行:./a.out
gcc的4个步骤:
1.预处理:gcc -E 1.c -o 1.i
包含头文件中的内容,做一些准备工作,是整个程序真正变得完整。
2.编译:gcc -S 1.i -o 1.s
编译生成汇编文件
3.汇编:gcc -c 1.s -o 1.o
生成二进制文件
4.链接:gcc 1.o -o 1
生成可执行的二进制文件
#include <stdio.h>
void main()
{
int a=-1;
//原码:10000000000000000000000000000001
//补码:11111111111111111111111111111111
// 37777777777
// ffffffff
//数据在内存中以补码的形式存储的,显示的时候显示的也是补码
//原码:二进制码,最高位为符号位,正数为0,负数为1
//正数的补码=原码
//负数的补码=原码的符号位不变,其余位取反+1
printf("%d %o %x\n",a,a,a);
}
常量:
特点:1.不能够被改变的量
2.可以不经说明直接使用的量
分类:
1.直接常量:
整型常量:10,20
实型常量:1.2
字符型常量:
普通字符常量(用单引号括起来的字符):'a','b'
转义字符常量:'\n'
字符串常量:"qwerty"
2.标识符常量:宏定义的名字
#define S 30
S即为30
整型常量的表达方式:
二进制:每位数上满2进1,0~1.
例:二转十:1101 => 1*2^3+1*2^2+1*2^0=13
八进制:以0开头,每位数上满8进1,0~7
例:023 转十进制 -> 2*8^1+3*8^0=19
十进制:每位数上满10进1,0~9,除了0之外,负数前面加负号
例:10,-1,0;
十六进制:以0x或0X开头,每位数上满16进1,0~9 a b c d e f/ A B C D E F
例:0x23f 转十进制 -> 2*16^2+3*16^1+f*16^0
二转八:11011110 =>0336
转十六 =>0xde
基本的数据类型:
int:基本整型,用来定义整型变量,接受一个整数
// short [int]:短整型,接受一个整数
// long [int]:长整型,接受一个较大的整数
float:单精度型,接受一个实数
// double:双精度型,接受一个较大的实数
char:字符型,接受一个字符常量
定义变量:在内存中根据变量的数据类型给它在内存中开辟空间,同一个变量只能定义一次,但是可以声明多次
只定义不赋值:
int a;
定义的同时赋值:初始化变量
int a=10;
用运算的结果给变量赋值
int b=1;
int c=3;
int a=b+c;
先定义后赋值:
int a;
a=10;
声明:int a;
变量名:
1.由字母,数字,下划线'_'三者自由组合而成。
2.数字不能打头。
3.在c语言中有保留字(int ,float),不能用来做变量的名字
4.在c语言中区分大小写,所以price和PRICE是2个不同的变量
int a,b,c=10,d;
字符常量需要用''括起来,字符变量一定要先定义才能用。
转义字符:以‘\’开头的字符常量,具有特殊的功能
\n 换行
\r 回车
\b 退格
\t 制表符tab
\' 输出'
\" 输出"
\\ 输出\
printf():标准输出函数,指向显示屏输出数据
格式:printf("格式控制=格式声明+普通字符",输出表列);
例:printf("a=%d\n",a);
注:在双引号中,以%开头的较格式声明,它是控制输出表列中的数据以何种形式输出,双引号中的其他字符叫普通字符,是会原样输出的。
格式声明:
1.d格式符:输出带符号的十进制数
%d:输出十进制数
%nd:输出的数占n个字宽,从右边开始
%ld:输出长整型数。
2.c格式符:输出字符型数据
%c:输出一个字符
%nc:输出的字符占n个字宽
3.f格式符:输出实型数据
%f:整数部分全部输出,默认输出小数后六位,第七位四舍五入
%.nf:整数部分全部输出,小数部分输出n位,第n-1位四舍五入。
%lf:输出双精度型数据
4.s格式符:用来输出字符串
5.o格式符:用来输出八进制数
6.x格式符:用来输出十六进制数。
scanf():标准输入函数,从键盘上按指定的格式获取输入的数据。
格式:scanf("格式控制",输入表列);
格式控制:同printf,
输入表列:在每个变量前加&
例:
#include <stdio.h>
void main()
{
int a;
float b;
scanf("%d%f",&a,&b);
printf("%d %.1f\n",a,b);
}
//当scanf中的格式控制符之间紧紧相邻,则在输入数据的时候,默认各数据之间以空白符间隔(tab,空格,enter).输入数据结束后按回车结束。
练习:从键盘上一次获取int a;float b,char c三个变量的数据,并输出他们的值。
#include <stdio.h>
void main()
{
int a;
float b;
char c;
scanf("%d %f %c",&a,&b,&c);
printf("%d %.1f %c\n",a,b,c);
}
在scanf的双引号中格式控制符之间通常以空格间隔,输入的时候输入空格间隔。通常,双引号中有什么普通字符,那么输入数据的时候就原样输入什么字符。
例:scanf("a=%d,b=%d,c=%f",&a,&b,&c);
输入:a=1,b=2,c=1.2<回车>
#include <stdio.h>
void main()c=2
{
int a;
char b;
int c=scanf("%d",&a);//scanf有返回值,返回数据列表的变量个数。
getchar();//吸收残留回车
scanf("%c",&b);
printf("a=%d b=%c\n",a,b);
}
ASCII:给每一个存储的字符找到的对应的数字
'a':97
‘0’:48
1.每一个大写字母比它的小写字母的码值小32
2.后面一个字母比前一个字母的码值大1
3.后一个数字的码值比前一个数字大1
练习:输入一个大写字母,输出它对应的小写字母。
#include <stdio.h>
void main()
{
/* char ch,A='B';
ch=A+32;
printf("%c\n",ch);
*/
char ch;
scanf("%c",&ch);
printf("%c\n",ch+32);
}
//c语言中的注释:注释只是便于阅读,不参与编译,
1.// :单行注释
2./*...*/:多行注释
int sizeof(变量名/类型名);计算变量或类型在内存中所占的字节的大小。
#include <stdio.h>
void main()
{
int a;
printf("%d\n",sizeof(a));
printf("int:%d short:%d long:%d float:%d double:%d char:%d\n",sizeof(int),sizeof(short),sizeof(long),sizeof(float),sizeof(double),sizeof(char));
}
算术运算符:加(+),减(-),乘(*),除(/),求模/求余(%)
1.两个整数相除,结果一定是整数,小数部分直接抹掉。
例:printf("%d\n",5/2);
2.求模运算符2边的操作数必须是整数
不同类型的数据间的混合运算:
1.把float型的数据赋给int型数据,整数部分赋值,小数部分丢失
2.把int型数据付给float型数据,数据不丢失,多了6个0
3.字符可以和整数直接进行运算,他们可以看做相互等价的。
4.在printf中格式声明输出的变量列表中的变量类型得严格匹配,除了字符和整数之间可以互相等价之外。
强制类型转换运算符:()
例:
#include <stdio.h>
void main()
{
float a=7.8;
int b=3;
printf("%d\n",(int)a%b);//%左右的操作数类型必须是int型,所以此需要强转
}
强制类型转换适用于自动类型转换不能够进行的时候使用,并没有改变变量的真实数据类型,只是产生了相应的中间变量。
练习:有4个水渠a,b,c,d往一个池子里注水,单开a,1天注满;单开b,2天注满;单开c,3天注满;单开d,4天注满;请问,a,b,c,d同时开,几天注满。
#include <stdio.h>
void main()
{
// printf("%f\n",(float)1/(1.0/1+1.0/2+1.0/3+1.0/4));
float a=1,b=2,c=3,d=4;//a=1.000000
printf("%f\n",1/(1/a+1/b+1/c+1/d));
}
自增运算符:++使变量的值加1
前置加加:++i 用(i)之前加
后置加加:i++ 用(i)之后加
例:#include <stdio.h>
void main()
{
int i=1;
// printf("%d\n",++i);
// printf("%d\n",i);
printf("%d\n",i++);
printf("%d\n",i);
}
自减运算符:--使变量的值减1
前置减减:--i 先自减再用
后置减减:i-- 先用再自减
a=i++;
a=++i;
a=i--;
a=--i;
#include <stdio.h>
void main()
{
int i=1,a;
/*a=i++;
printf("%d\n",i++);
printf("%d\n",i);
*/
a=++i;
printf("%d\n",a);
printf("%d\n",i);
}
putchar(字符常量/字符变量);
例:
#include <stdio.h>
void main()
{
putchar('a');
char a='b';
putchar(a);
putchar('\n');
}
练习:向屏幕输出boy
#include <stdio.h>
void main()
{
/* putchar('b');
putchar('o');
putchar('y');
putchar('\n');*/
putchar(98);
putchar(111);
putchar(121);
putchar('\n');
}
getchar():从标准输入(键盘)获取一个字符,该函数有返回值,返回获取的那个字符,如果没有获取到,会一直等待,直到获取到,因此可以利用该特性进行暂停程序的运行,在在调试代码的时候可以单步运行
例:
#include <stdio.h>
void main()
{
char ch=getchar();
putchar(ch);
}
练习:从键盘输入boy,并输出boy.
#include <stdio.h>
void main()
{
/*
char ch1=getchar();
char ch2=getchar();
char ch3=getchar();
putchar(ch1);
putchar(ch2);
putchar(ch3);
putchar('\n');
*/
char ch=getchar();
putchar(ch);
ch=getchar();
putchar(ch);
ch=getchar();
putchar(ch);
putchar('\n');
}
1.程序是顺序执行,从第一行依次往下执行,同一行如果有多条指令,从左往右执行。
2.“左=右” :等号叫赋值运算符,即先执行右边的,再执行左边的,把右边的值付给左边的变量
3.从键盘上输入数据的过程:从键盘上输入数据,直到按了回车键才会把所有的数据放到键盘缓冲区中去,当程序运行的时候需要获取输入,如果键盘缓冲区中有数据,则会自动去键盘缓存区中依次取,如果缓冲区中没有了数据,才会需要你继续从键盘输入数据,直到你按了回车键才把数据的数据继续填充到键盘缓冲区,然后再从缓冲区中取数据。