1.C语言的特点
(1)C语言是一中面向过过程的编程语言
(2)是一种结构化程序设计语言,特别适合大型程序的模块设计 (通过函数来实现)
(3)允许直接访问物理地址,能进行位(bit)操作,可以直接对硬件进行操作
2.HelloWord程序
#include<stdio.h>//这个是个标准的输入输出头文件
int main()//一个主函数
{
printf("Hello world!\n"); //输出hello world 并且要换行
printf("中国");
return 0;//结束。
}
/*
#:是一种预编译符号
stdio:standard input & output 标准的输出输入函数
h:header 头文件
#include<stdio.h>:C语言不提供输入输出函数,作用是引入输出输入函数
注释:解释这个代码的作用,不参与C语言的执行,编译器看不到的意思
*/
//:一行的注释
/*:注释多个行*/
/*int main():一个程序里面有且只有一个主函数(main()),必须要有主函数,但是只可以是一个主函数,主函数是程序执行的入口
语句:就是以一个;结尾就叫做一个语句
{}:叫做函数体
注意:每次修改了程序后,要运行的话,首先要编译,且没有错误,才可以运行
所有的编程必须在英文状态下敲代码,包括符号也是,必须在英文状态下*/
总结
1.C语言本身是不提供输入输出语句,输入输出操作是由C标准函数库中的函数实现的 <stdio.h> <math.h>等等
2.C语言的算法可以有0个或者多个输入,但必须要有1个或者多个输出(必须要有输出)
3. .c源文件—— 编译——.obj 目标文件 ——连接—— .exe可执行文件
3.基本数据类型和基本输入输出
一.常量
其值不可改变的量。例如1,-1,0,0.1,1.2E10。
1.整型常量 1,0,-1
2.实型常量(小数)
1).小数形式 0.1
2).指数形式 E或者e代表以10为底的指数 12000 1.2e4
注意:(大小写都是一样的)e或者E之前必须有数字,且e或E后面必须是整数 E4 1.1e1.1(错误形式)
3).进制形式
八进制:以0开头,由0-7组成的数。如,012
十六进制:(0--15)以0X或0x开头,由0-9,A-F或a-f 组成。如,0x3A
3.字符常量
普通字符(字符)单:单字符, 单引号括起来 ‘a’ ‘1’
在ASCII中得出的规律:
1.记住A 和 a 的ascii码 A 65 a 97 A+32=a;
2.大写的字母比小写的顺序要小,十进制小
3.相同大小写的字母顺序大的 十进制也大
4.字符和整型可以直接转换
4.字符串:
双: 双引号 “aa” “aaa” “a”用字符数组来表示字符串
5.转义字符:
什么叫转义字符 赋予其另外一种含义
空格:32
扩展
‘\12’ 2*8^0+1*8^1 八进制对应的ASCII码值(十进制)
‘\x12’ 2*16^0+1*16^1 十六进制对应的ASCII码值(十进制)
6.符号常量:
用一个符号名代表一个常量 关键字(define) 编译预处理会在编译前处理好
格式如下
#define PI 3.1415926
注意:习惯性用大写字母表示,且见名只义:例如PI,表示圆周率
代码:
#include<stdio.h>
#define PI 3.1415926
int main()
{
printf("%lf",2*PI);
return 0;
}
--------------------
输出结果是:6.2831852
二.变量
可以改变的量 必须先定义,再使用
它的本质:(一段连续)内存空间的别名,变量是一个符号 内存空间可以再取别名
变量的声明:int a a=10; 没有分配字节 空壳子
变量的定义:int a=10; 分配了字节 有内容的
1.常变量
const int a=1;
表示在变量存在期间它的值不会改变
补充:
常变量、符号常量和常量的区别:符号常量不占用内存空间,在预编译时就全部由符号常量的值替换了,而常变量占用内存空间,只是此变量在存在期间不能重新赋值,常量是没有名字的不变量,常变量是由名字的不变量
三.标识符
在程序中使用的变量名、函数名、标号等统称为标识符
特点:
标识符只能是字母(A~Z,a~z)、数字(0~9)、下划线(_)组成的字符串,并且其第一个字符必须是字母或下划线
在标识符中,大小写敏感。A 和 a
尽量做到见名知义
关键字是不可以作为标识符的,否则乱
四.数据类型
通过存储单位(字节数)来区分数据的大小
不同类型的的数据在内存中占用的存储单元长度是不同的
数据类型的本质:
(1) 数据类型可理解为创建变量的模具(模子);是固定内存大小的别名
(2) 作用:编译器预算对象(变量)分配的内存空间大小
C语言是没有规定哪个数据类型占用多大的字节数,全是编译系统规定的
void main21()
{
int b = 10;
int a[10] = {1, 3, 44, 2, 3, 44, 5, 5,6, 67};
printf("a:%d &a:%d \n", a, &a); //a &a大小一样
printf("a+1:%d &a+1:%d \n", a+1, &a +1 ); //+1 大小不一样
//a &a数据类型不一样 步长不一样
system("pause");
}
1. int型 分配4个字节(32位)
存储方式:用整数的二进制补码形式存放
正数:二进制原码,反码,补码均为相同 负数看图知
13 -13
原码 0000 1101 1000 1101
反码 0000 1101 1111 0010
补码 0000 1101 1111 0011
二进制转十进制
0001 0101 0001 1111 从二进制转为十进制方法如下,如是八进制则将2 改为8
在二进制码中,为了区分正负数,采用最高位是符号位的方法来区分,正数的符号位为0、负数的符号位为1
2.short(短整型) 分配2个字节,其他和int一样
3.long(长整形) 分配4个字节,其他和int一样
4.有符号和无符号:
针对的是整型和字符型
有符号:有正数也有负和0 [signed] int int 例如4个字节 -2^31--0--2^31-1
无符号:只能为正和0 unsigned int 范围不一样 例如4个字节 0----2^32-1 无符号的输出控制为%u
当给无符号赋值为负的时候,会出现错误的结果.
/*Demo11(无符号的输出)*/
#include<stdio.h>
int main()
{
unsigned int a=-1;
printf("%u\n",a);
return 0;
}
5.char 字符型 占一个字节 如char a='c';
6.float 单精度浮点型,占4个字节 六位有效数字:
系统保证在规定的有效数字之内是正确的,但超过了有效数字的范围,系统就不保证你的正确性了
系统只会输出小数点的后6位
如:12. 有个点可以理解为小数
7.double 双精度浮点型 占8个字节 15位有效数字
Sizeof是操作符.关键字,不是函数:sizeof(变量名或者是数据类型) 例如sizeof(i),sizeof(int )输出的是占用的字节数
double类型的输入不能使用%f进行输入,得用%lf才能正常得到a的值。
而在输出ddouble类型时却可以用%f,这是因为printf("%f",a);在执行时C自动将float型的参数转换成double型。
故double型的输入输出形式如下:
double a;
scanf("%lf",&a);
printf("%f",a);
float 为单精度,有效数字为6~7 double 为双精度,有效数字为15~16 但他们在输出时,小数点后都有6位小数
五.输出
printf(“全部输出”);除特殊% \之类的
注意:printf("格式",数据);数据是什么类型,格式就写与之对应的类型,不然会输出错误的结果
任务:输出% 输出\
代码:
/*输出百分号和反斜杠*/
#include<stdio.h>
int main()
{
//printf("%chello world!\n",97);
//printf("hello world!\n%c",97);
//printf("c\n");
printf("%q\n");//百分号类似于打印的功能,除非特殊情况下(%d,%c,%lf.....)
printf("\q");//\类似于打印的功能,除非特殊情况下(转义字符的情况下)
return 0;
}
-----------
输出结果 q q
#include<stdio.h>
int main()
{
printf("I Love China!");
return 0;
}
------------
输出结果 I Love China!
1,int,short型输出 %d
代码:
/*Demo10(整型的输出)*/
#include<stdio.h>
int main()
{
int num1;//num1是个变量,并且它是int 型变量
num1 = 10;//这里两句语句可以用一句来表示 int num1 = 10;
printf("%d\n",num1);
printf("%3d\n",num1);//总共输出三列,并且靠右边,左边没有的数字用空格来表示
printf("%-3d",num1);//总共输出三列,并且靠左边,右边没有的数字用空格来表示
return 0;
}
--------------
输出结果
10
10
10
2. 无符号的输出 %u
#include<stdio.h>
int main()
{
unsigned int a =-1;
printf("%u",a);
return 0;
}
------------------------
输出结果 4294967295 看Demo11
思考
#include<stdio.h>
int main()
{
unsigned short a =-1;
printf("%u",a);
return 0;
}
3.short型输出 %d 如果超出该类型的数字会溢出,则会输出垃圾数字
4.long型输出 %ld 同上述
5.char 型输出 %c
char 与 整型的转换
char 类型在计算时都转换成整型 再进行计算 例如 ch='A' ch+32=65+32=97
字符转换为整型 如‘5’-‘0’=5 整型转化为字符 如 5+‘0’=‘5’
/*Demo14(字符型和整型的转换)*/
#include<stdio.h>
int main()
{
char ch='a';
int a=65;
printf("%c\t%d\n",ch,ch);
printf("%c\t%d\n",a,a);
return 0;
}
---------------
输出结果是
a 97
A 65
字符与整型有的时候是可以通用的(范围内)
注意:当你的整型超过了字符型的范围时,就会按照你所在的地方的国家规定的编码来输出,我们国家是gbk编码(在网上看的)
6.字符串输出 %s
代码
/*字符串的输出*/
#include<stdio.h>
#include<string.h>
int main()
{
char arr[10]="drererert";//利用数组来装字符串
int a = sizeof(arr);
int b = strlen(arr);
printf("%s\n",arr);//字符串的输出格式
printf("数组里面分配%d个字节\n",a);
printf("数组里面有%d个字符\n",b);
return 0;
}
-----------------
输出结果
drererert
数组里面分配10个字节
数组里面有9个字符
7.float型输出 6位小数,6-7位有效数字
#include<stdio.h>
int main()
{
float a;
a=1.2345678f;//输出结果为1.234568,小数点的第七位是利用四舍五入进了一位,所以为1.234568
printf("%f\n",a);
return 0;
}
%m.n格式输出 -%m.n格式输出
/*float的输出*/
#include<stdio.h>
int main()
{
float a;
a=1.2345678f;
printf("%f\n",a);//输出结果为1.234568,小数点的第七位是利用四舍五入进了一位,所以为1.234568
printf("%12.7f\n",a);//m.n的格式,m是共占用多少的列,n是指小数点输出多少位,并且它是靠右边的 1.234568
printf("%-12.7f",a);//m.n的格式,m是共占用多少的列,n是指小数点输出多少位,并且它是靠左边的1.2345678
return 0;
}
对于%c用m.n格式的用法都是 一样的 scanf(“%4s”,ch);4s表示有效字符为四个
printf("%ns",ch); n表示最少输出n列(靠右)的意思,不够用空格补充
若是-n则最少输出n列靠左边的,不够也用空格补充
#include<stdio.h>
int main()
{
char ch[10];
scanf("%4s",&ch);
printf("%s\n",ch);
return 0;
}
----------------
输出结果
asdasdasd
asda
8.double型输出 6位小数,15位有效数字(有效%n数字之内保证正确,超过了不负责) %lf %f
#include<stdio.h>
int main()
{
double a=1.0;
double b=3.0;
printf("%lf",a/b);
return 0;
}
-------------------
输出结果 0.333333333f
#include<stdio.h>
int main()
{
double a=1.0;
double b=3.0;
printf("%20.17lf\n",a/b);//输出为 0.33333333333333331 ? 这就是有效数字在作怪
printf("%.17lf\n",a/b)//输出17位小数
return 0;
}
---------------------------
输出结果
9.指数形式输出 %e
#include<stdio.h>
int main()
{
float a=22223.34567888f;
printf("%e",a);
return 0;
}
---------------
输出结果 :2.222335e+004
11.指数.小数格式输出 %g
(看谁输出的字符更短就输出谁)
%g格式 符,用来输出实数,输出格式为f格式或e格式,系统根据数据占宽度m大小,自动选择占宽度较小的某种格式输 出,%g格式符不输出小数点后无意义的零
12.八进制格式输出 %o
#include<stdio.h>
int main()
{
int a=16;
printf("%o",a);
return 0;
}
--------------------
输出结果 20
13.十六进制格式输出 %x
#include<stdio.h>
int main()
{
int a=16;
printf("%x",a);
return 0;
}
-------------------
输出结果 10
注意:x,e,g外,其他输出格式必须小写。
六.输入
大多数情况下都要加上&(取地址符);
一般格式
scanf(格式控制%d,地址表列&a) scanf遇到空格结束
scanf(格式控制n%d,地址表列&a) 若输出的数中间有空格 n若取到第一个空格之前的数,之后的数就无效
反之,第一个空格之前的数没有达到n个,将数值全部输入
如
int main()
{
int a,b;
scanf("%3d%d",&a,&b);
printf("%d%d\t",a,b);
return 0;
}
---------------------
输入
123 45
输出结果
12345
输入
12 345 67
输出结果
1234567
用语句scanf( %c%c%c ,&c1,&c2,&c3)输入a└┘b└┘c时,变量c1、c2、c3的值分别为
└ ┘ 应该是空格
scanf 需要精确匹配, 因为你的匹配项目是 %c%c%c 所以答案是`a`,`└ ┘`,`b`
如果匹配项目是 %c %c %c 那么答案就是 a b c (注意%c中间有空格)
格式控制那里不一样的格式,控制台就会有不一样的输入格式
注意事项:输入数值数据时,遇到空格,回车,tab或者非法字符则认为该数据结束输入
scanf("%d%d%d",&a,&b,&c);
输入:用空格,或者回车,或者tab或者非法字符来结束一个变量的输入
scanf("%d,%d,%d",&a,&b,&c);
按照格式控制表列里面的格式来输入,例如是,则用,来隔开
scanf("%d%c%lf",&a,&b,&c);
输入格式为:1c3.3 输出为 1 c 3.300000
scanf("%d,%c,%lf",&a,&b,&c);
输入格式为:1,c,3.3 输出为 1 c 3.300000
scanf(“%d,%f,%c”,&a,&b,&c);
输入格式为:1,2.2,c 输出为 1 c 3.300000
scanf(“%d:%f:%c”,&a,&b,&c);
输入格式为:1:2.2:c 输出为 1 c 3.300000
总结:scanf输入的内容 是根据scanf中双引号的格式进行输出,若格式对应不上,就会出现输出错误
补充:整型的格式输入,例如20170822
#include<stdio.h>
int main()
{
int year,month,day;
scanf("%4d%2d%2d",&year,&month,&day);//读取指定位数的数字 %4d :读取前面四个数字 20170822 读取的是2017
printf("%4d\n%2d\n%2d\n",year,month,day);
return 0;
}
七.运算符
1.运算符的种类
(1).算术运算符
用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。
- +-*/混合运算 (5/3) (-5/3)= -1(vc.0)不一样的编译系统答案可能不一样,有的可能为-2 int/int 型 结果也为int 型
- 格式控制输出%d 之类的 ,必须和后面的变量计算的结果类型相一致,不然就会出错 printf("%d\n",5/3);
- 求余数(参与操作的数只能为整数)
- 自增 i++, ++I,前者是先让i运算,再加1,后者则先加1,在运算
- 自减 i--,--I; 前者是先让i运算,再减1,后者则先减1,在运算
注:printf("%d\n",x+=x++;x++);
pirntf函数中的表达式的结合顺序是由右向左,所以先算x++,再算x+=x++
(2).关系运算符
用于比较运算。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)和不等于(!=)六种。
关系运算符运算返回的结果的是逻辑结果.bool类型,就是一个逻辑值,即“真 1”“假 0”
=赋值 == !=
(3).逻辑运算符(返回的结果也是真,或者假这两种情况)
用于逻辑运算。包括与(&&)、或(||)、非(!)三种。
四种关系一一对应:(真true 1 非0) (假 false 0 0)
- &&相当于并且的意思,||相当于或的意思
- &&:两个为真则为真,其中一个为假则为假 4&&0
- ||:两个为假则为假,其中一个为真则为真
- !:非0为真,0为假(判断计算过程) !5