>>>>>>>>>>>>>>####
输出浮点型的整数部分:
printf("%d.0",23.456)  //.0小数点前默认为0
>>>>>>>>>>>>>>####
常量(constant)是程序中不可改变的量;
作用:给变量赋初值;
表现形式:直接数字(23、0x22、‘w’、‘abcd’),宏定义;  //decimalism-->十进制
变量(variable)定义:数字、字母、下划线,不以数字打头;32关键字不能用;区分大小写;
>>>>>>>>>>>>>>####
(signed) char 8位  -128 —— +127(这是补码的编码规则)
补码:正数的补码是本身,负数的补码是原码+1;在计算机中存储的都是补码;
char        1字节      8位      -2^7 到2^7-1
short (int)    2字节      16位      -2^15到2^15-1
int          4字节      32位      -2^31到2^31-1
long (int) 4字节      32位      -2^31到2^31-1
long long (int) 64字节    **位      -2^63到2^63-1
signed可省略
>>>>>>>>>>>>>>####
float型存储架构
32位  1位符号位  8位指数为  23位整数位  6到7位有效位数
234.45689表示为指数形式0.23445689*10^3   
double型
64位  1位符号位  11位指数为  52位整数位      15到16位有效数字
sizeof(类型) 测试该类型数据的字节数
float b=3.5f;
printf("float = %d\n",sizeof(float));      \\浮点型大小
printf("b = %d\n",sizeof(b));      \\变量的大小
printf("3.5f = %d\n",sizeof(3.5f));    \\3.5f的大小
printf("3.5 = %d\n",sizeof(3.5));    \\3.5的大小,系统默认3.5的大小为8位;
输出
float = 4
b = 4
3.5f = 4
3.5 = 8
数字与ASCII码的对应
48-->0  49-->1  50-->2  51-->3  52-->4  53-->5  54-->6  55-->7  56-->8  57-->9
大小写之间ASCII码差32
>>>>>>### 或 与 >>>>>#
计算机语言表达区间
闭区间:a>x1 && a<x2
开区间:a>x2 || a<x1
>>>>>>#### printf >>>>>#
printf格式化输出
%md    m:域宽  默认右对齐,加“-”可左对齐;当域宽小于实际域宽时,原样输出;
%m.nf  m:域宽  n:小数位数,默认输出6位小数;当域宽小于实际域宽时,原样输出;
%f 即可输出float又可输出double类型的
%lf 输出long double类型的
long long用什么输出?  用%lld格式输出
>>>>>>## 转义 >>>>>#
转义
printf("\"china\"");输出"china"
\n 换行
\r 回车(让光标回到该行的起点)
\t tab,制表
若想打印%d;则要printf("%%d");
>>>>>>#      求商求余 >>>>>#
取余运算  和  取商运算  结果的符号与被除数相同        //  %(取余)要求左右两边都为整形数
被除数=商*除数+余
>>>>>> 赋值和格式转换 >>>>>#
数据丢失:   
大数据赋给小变量  有可能  会发生数据丢失:
trancate 截断 ;trancation  名词;
符号扩展:
小数据赋给大变量不会数据丢失,为了保证数据的完整,要进行符号扩充;
自动类型转换
char + short + int 首先会将char和short转换成int类型:integer promotion(整形提升) //小数据向大数据转换
int + unsigned  都要转换成无符号进行运算    //小数据向大数据转换
int a=2.5    输出a的值是 2
float b=5  输出b的值是5.0
int + long long      int会转换成long long          //小数据向大数据转换
int + float    int转换成float
>>>>>#### getchar()和putchar() >>>####
b = getchar();
putchar(b);
>>>>>>> 表达式 >>>>>###
算术表达式 逻辑表达式 关系表达式 赋值表达式
表达式是由运算(操作)符加操作数,什么操作符即构成什么表达式;
操作数本身又可以是一个表达式,( m3 = m1 + m2 ;m1 + m2 是一个操作数又是表达式)
赋值表达式:
变量 = 表达式 ;任何表达式都是有值的;赋值表达式是将右值赋给左值,
复合赋值表达式:
x+=5 -> x = x + 5 (若 x = + 5 ,则把 +5 赋给x;)
a?=b -> a = a ? b ( ? 代表 + - * / )
关系表达式:
if ( x == 5 ){ ********** }; x=5 则执行{ }中的内容;
if ( x = 5 ) { *********  }; 将5赋给x,()会一直为真;
\\\\\\\\\\\\\\\\\\\\在编写程序时:当常量和变量进行比较时,将常量写在前面,即( 5 == x )\\\\\\\\\\\\\\\\
判断一个数能否被谁整除,即判断对其求余是否为零;
逻辑表达式:
与 && x1<x<x2  x>x1&&x<x2
或 || x<x1或x>x2 x<x1||x>x2
非 ! 0为假,非0为真;
int a = 1,b = 13;
if(a++||b--) //或运算,当运算的开始端为1,则后面的不再计算;//与运算,当运算开始端的值为0,则后面的不计算;
printf("b=%d\n",b);printf函数括号内参数的构成解说
条件表达式将从左到右一个一个执行并进行判断,一旦给定的条件足以判断真假时,之后的条件则不会执行!!!
逗号表达式:
“表1,表2,表3”  该表达式的值为表3的值;逗号“ ,” 的运算及最低,其最值是最后一个表达式的值;(用于for循环)
for(xx%400==0)  -->for(!(year%400))
for(xx%400!=0)  -->for(year%400)
获得一个数的各个位上的数值
4    long ge,shi,qian,wan,x;
5    printf("\ninput a 5 wei shu :\n");
6    scanf("%ld",&x);
7    wan=x/10000;
8    qian=x%10000/1000;
9    shi=x%100/10;
10    ge=x%10;
>>>>>>#### 顺序、分支、循环 >>>>>#
2大选择:   
$$$$$$$$$$$$$ if $$$$$$$$$$$$$$$$$$ 
方案1:
if(***)
****
***
else
if(***)
方案2:
if(***)
if(***)
else
方案1优点
方案2容易造成逻辑混乱;else总是和他前面一个尚未配对的if配对,用大括号补救(“{ }”的作用在于打包,使多句话在逻辑上变成一句话;)
8    if(a>=90)
9        printf("you xiu!\n");
10    else if(a>=80)
11        printf("liang hao!\n");
12    else if(a>=70)
13        printf("zhong deng!\n");
14    else if(a>=60)
15        printf("ji ge!\n");
16    else
17        printf("game over!\n");
else if——建议把每一路的范围写清楚,是每一路的选择不依赖于上一步的成立与否;
8    if(a>=90)
9        printf("you xiu!\n");
10    else if(a>=80&&a<90)
11        printf("liang hao!\n");
12    else if(a>=70&&a<80)
13        printf("zhong deng!\n");
14    else if(a>=60&&a<70)
15        printf("ji ge!\n");
16    else
17        printf("game over!\n");
编译通不过;因为else没有匹配的if,
5    if(a>5)
6        b=20;
7        c=30;//错误之处
8    else
9        b=30;
10        c=20;
$$$$$$$$$$$$$$$$ switch——case $$$$$$$$$$$$$$$$$$
switch(表达式a) //a的结果为整型,可以由变量或其他类型数据得到结果为整型的表达式
{
case 表达式 b: //表达式 b 必须是“整型常量表达式”;
break; //有switch就一定要用break;
}
@@@@@@@@@@@@@@@@总结:if 构成的多路选择多用于“范围”的选择; switch 构成的多路选择多用于“点”的选择
@@@@@@@@@@@@@@@@@@@@@@当两者都可完成时,三步以内用if;
¥¥¥¥¥¥¥¥ switch的优化:把概率高的语句放前面,把概率低的放后面;
val=(a>b)?x:y+1(简洁2):a>b吗? 如果a>b就把x的值赋给val,如果不是则把y+1值赋给val;算术运算符运算级高于条件    运算符 ( 自右至左:val=(a>b)?x:(c>d)?c:d  相当于y=(c>d)?c:d,然后val=(a>b)?
x:y )
a+=b;(简洁1)
3达循环: 循环的三要素:1、循环变量初始化; 2、循环终止条件; 3、有是循环趋于结束的语句;
while/do…while:先执行,后判断;一般用于选择性输入的时候,
当第一次条件判断条件为真时,两者逻辑等价
当第一次条件判断条件为假时,while一次不做,do…while做一次;
for :当两层循环,且与循环内外无关时,将循环次数少的放在外面,以提高效率;
for循环时,for(i=0;i<10;i++) 而不用for(i=0;i<=9;i++) //因为循环很多情况都是为数组服务;
4大跳转: break :前面一定跟条件语句;
continue:前面一定跟条件语句;过滤功能;
return :在程序中可以有多个return;当运行到return时,当前函数结束;
go…to
>>>>>>>>## 数组 >###
>>>###
一维/数组:内存中开辟的一段  连续的  存储区域,用于存储  相同数据类型  的一种数据结构;
基本数据类型:整型,实型;
构造数据类型:数组,结构体;
数组初始化:可以全部初始化,也可部分初始化; int a[]={ 1,2,3,4,5,6,7,8,9 };
两个凡是:凡是基本数据类型即可在定义时初始化,也可先定义在初始化;凡是构造数据类型要么定义时初始化,不可以先定义再以初始化的
方式初始化;
错误表示:
int a[3];
a[3]={1,2,3}; //不可以先定义再以初始化的方式初始化
数组a[3]表示的是a[0]到a[2],"a[3]"的写法正确,因为c语言不进行越界检查,逻辑错误!
数组清零:a[10]={0};
访问一维数组的三种方法: 1、下标法(菜鸟发)
2、偏移法(本质法)
3、指针法(老鸟法)
二位/数组初始化: a[2][3]={ 1,1,1,1,1,1 }; a[2][3]={ 1,1,1,1} a[2][1]和a[2][2]为0;
a[2][3]={{1,1,1},{1,1,1}},按行初始化;
a[][3]={1,1,1,1,1,1};是可以的,但是a[2][]={1,1,1,1,1,1}是不可以的;行数可省略,列数不可省略;因为数  组的赋值是根据列数来赋值
a[2][]={{1,1,1,1},{1,1,1}}也不行,因为不知道有多少行;
访问二位数组的三种方法: 1、下标法(菜鸟发)
2、偏移法(本质法)
3、指针法(老鸟法)
数组名是数组的唯一标识符;
指针有类型,数组名本身是个常量指针;
!!!!!!!!!!!!!附 :程序在"c程序"中;!!!!!!!!!!!!
数组元素的表示方法是:
数组名称[行][列]
对于m行n列的二位数组,a[0][0]是数组的第一个元素;a[m-1][n-1]是最后一个元素;
a表示第0行首地址,a+i表示第i行首地址;
*(a+i),  a[i],  &a[i][0]表示第i行第0个元素;
*(a+i)+j a[i]+j,  &a[i][j]表示第i行第j个元素的地址
*(*(a+i)+j) *(a[i]+j), a[i][j]表示第i行第j个元素
>>>>###  不用第三个变量,把两个变量交换  >>>>#
a=3; b=5;
把a,b交换:
a = a + b;
b = a - b;
a = a - b;
>>>>###  指针  >>>>>>>#
内存是以字节为单位编址,每一个内存单元都对应一个32位地址(32位机);
对变量取地址,是取其数据空间中低位字节的地址;
int *p 指针的类型决定了指针变量所存放的地址的寻址能力;*p寻址能力是四个字节;
#include<stdio.h>
int main()
{
int a;
int *p=&a; //定义时同时初始化;
int *q;  //对于没有初始化的指针称为"野指针";杜绝野指针;如果临时不用则将其初始化为NULL
int *q = NULL;
}
指针可以++/--;
也可以赋值;
还可以比较;指针
可以比较的前提是 内存编址有高低;
数组名是数组的唯一标识符;也是一个指针常量;而且是个常量,可以a+1(表示从a开始偏移一个单位),但不能a++;
合法:
int a[5];
int *p=a; //把数组a的首地址给p;也可表示为:*p=&a[0];
for(i=0; i<5; i++)
printf("%d\t",*p++); //*和++的运算级别相同,*p++中先做++然后再做*,但是因为++是先使用再自加;
输出是从a[0]开始的;
1、数组名是一个常量,不允许重新赋值;
2、指针变量是一个变量,可以重新赋值;
3、p+i和a+i均表示为a[i]的地址,均指向a[i]
4、*(p+i)和*(a+i)均表示p+i和a+i所指对象的内容a[i];
5、*p++:等价于*(p++),起作用:先得到*p,再使用p=p+1;
6、(*p)++:表示将p所指向的变量(元素)的值+1;即等价于a[i]++;
>>>>>>## 函数 >>>>>>>>####
c语言包含: 1、语法规则
2、c标准库(内置函数) //当不知道一个函数在哪个头文件,如printf;方法:man 3 printf
函数没有类型,有的只是函数返回值类型;int main():main()函数的返回值为int 型;
函数的命名:见名知意;格式从变量(数字,字母,下划线);函数名只是一段代码的起始地址;
函数的参数如果有多个,用","隔开;
inplicit:隐含的
declaration:声明
在vim下编译包含math.h的文件,格式:gcc pow.c -o pow -l m //m代表math.h
函数的声明:声明的位置在原理上讲,只要在函数被调用之前即可,通常置于main函数前,预处理之后,便于查;
多个函数嵌套时,被调用的函数必须声明在调用函数之后;
全局变量,局部变量: 凡是大括号以内的皆为局部变量,凡是大括号以外的皆是全局变量;局部变量的作用域是大括号内,从局部变量定    义开始到大括号结束;全局变量的作用域是从全局变量定义开始,到本文件结束;不同作用域可重名;相同作用域  不能同名;
当作用域不同时,有重名,当全局变量和局部变量重名时 局部变量 屏蔽 全局变量作用域;
普通全局变量 和 被static修饰过的变量 未初始化时,值默认为0;
变量存储类型:
1、auto: 自动变量  只用于修饰  局部变量;局部变量存于程序空间的栈中; 特点:随用随开,用完即消;
2、registe: 寄存器变量  存储于cpu的寄存器,运算最快;
3、static: 静态变量  修饰局部和全局变量,存在于data段;只初始化一次;再次调用的值是上次调用结束的值;
常用于  记录一个函数的调用次数;
4、extern: 扩展变量的作用域;可以是跨文件的;也可以是文件内的;但是被static修饰过的变量不能被扩展;包括文件内和    外;
1

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论