C语言学习笔记(一)

1.头文件:#include表示标准(std)io流(io),#include表示标准库,提供了system("pause");主函数标准形式

int main(void)//不接受任何一个参数的主函数,c99标准
{
retrun 0;
}

2.内建函数:一些编译器自带的函数体(c中printf()不加头文件也可输出,就是此原因)
3.整形(int ,short, long, long long)

#include
#include
int main(void)
{
//有符号
    int a = 12;//定义  
//有符号整形: -2^31~2^31-1 -2147483648~2147483647 如果整形大于2147483647则会变成负的。例如:21473648 输出为-2147483648
//无符号:0~4294967295 有符号的范围去符号相加即可 4字节同上
    int b = 13;
    int c;//声明 0xcccccccc
    int d = 2147483649;//-214748364912
    int f = sizeof(int);//2012以下低版本会报错,无变量自动提升的功能
    printf("%d\n",d);
    printf("得到类型的大小:%d\n",sizeof(int));//4 单位字节
    printf("%d %d\n", a,18);//格式化输出 %d输出一个10进制数
    printf("%d %D \n %o %O\n %x %X\n", 12,12,12, 12, 12,12);//10进制8进制16进制 输出12 D 14 O c C
    //12 = 13;//报错  左操作数必须为左值   
    a = b = 20;
    printf("%d %d\n", a, b);
//无符号
    unsigned int aa = 25;
    printf("无符号%u\n", aa);//用%u输出无符号整形输出

//短整型
    short s = 15;//2字节 int不小于short的长度
    //有符号:-2^15~2^15-1  -32768~32767
    //无符号:0~2^16-1 0~65535
    printf("%hd\n", s);//%hd进行格式化输出(%d也可以)
//长整形
    long l = 15;//一般电脑long为4字节和int一样(无符号有符号范围),标准规定long不小于int长度
    printf("long的字节:%d\n", sizeof(long));
    printf("%ld\n", l);//用ld格式化输出
//超长整形 vc++6.0不支持
    long long ll = 56;
    //有符号:-2^63~2^63-1  
    //无符号:0~2^64-1 
    printf("long long的字节:%d\n", sizeof(long long));//8
    printf("%lld\n", ll);//用ld格式化输出

    //system("pause");
    getchar();
    return 0;
}

4.内存大小:字节是计算机常用的存储单位,位是计算机最小存储单位,1字节等于8个二进制位
5.&取址,%p地址的格式化输出。%#p加上0x;vs2015使用scanf()会报错,要么改用scanf_s()或关闭sdl检查(其他方法网上很多)。

int a = 12;
    printf("%p\n",&a);//输出地址用%p
    printf("%#p\n", &a);//输出加上前缀的地址用%#p
    
    int c;
    scanf("%d%d", &c,&a);//输入格式要对应,紧挨着需要空格一下;转义字符间用什么符号隔开,输入时也要用同样的符号隔开
    scanf("%d%d\n", &c, &a);//不能加\n 加了输入不进去。不然敲多少遍回车也没用
    printf("%d %d\n", c,a);

6.浮点型(float ,double ,long double)

#include
#include//浮点型头文件
int main(void)
{
    float a = 12.26f;//未加f警告:从double向float类型截断,损失精度了
    printf("长度:%d 大小:%f\n",sizeof(float), a);//长度4 输出格式符用%f
   //内存大小 4 
    //有效数位(单精度):看有效数字,从第一个不为0的开始数。标准最低为6位数,设置多少由编译器决定。第六位四舍五入

    double a1 = 12.23;//double中加小写l或L  13.123+123 会先转double再计算
    double a11 = 122727727.23278728276727827;
    printf("长度:%d 大小:%lf\n", sizeof(double), a1);//长度8 输出格式符用%lf
    printf("%f 10%.15lf\n",a,a11);//.15表示保留15个小数位(最后一位四舍五入),10代表数字宽度,过宽在数字前用空格代替
   //内存大小 8 
    //有效数位(双精度)标准最低为10位数,设置多少由编译器决定

    long double a2 = 12.2325;
    printf("长度:%d 大小:%e\n", sizeof(long double), a2);//长度8,输出格式符用%e(科学计数法).用%lf输出也可以,但是会损失精度。只能精确到double
    printf("%e\n",FLT_MIN);//右键转定义,查看最大值的宏定义
   //内存大小 8 不小于double 
    //有效数位(单精度)标准最低为6位数,设置多少由编译器决定

    //输出时%f %lf 可以混用哈,三者都可以用
    //输入时float 用%f double和long double 只能用%lf

    getchar();
    return 0;
}

7.整数的存储是转为二进制再存,负数则是其补码(按位取反+1);小数的存储32位,首位存符号位(0为正1为负),后8位位存整数(-128~127),再后23位存小数位(2^23七位十进制数)

小数存储方式图

8.运算符优先级(由上到下递减),记忆下后缀--和++比前缀的优先级高哦。用%取最后一位数,用/10来去掉最后一位数,不用四舍五入
优先级表

优先级问题:b=a++,++比=优先级高,为啥b为啥是原来的值?黑箱子理论,把++a,a++啥的看成一箱子,这箱子叫c。我使用的值,是黑箱子的值。
优先级问题解答

9.循环(while for do···while)没有大括号“{}”默认读取到第一个分号“;”结束,有空行不影响。break跳出循环(若是嵌套循环,只跳出内层循环),continue执行下一句语句。切记:break continue只用于循环语句中。
表达式:有值的语法结构,由运算符将(变量,常量,函数返回值等)结合而成。
语句:没有明确值的语法结构
表达式图一

表达式图二

表达式图三

int i,j;
for(i=1,j=5;i<5;i++,j--)//i<5若不写的话,默认值为1,为真
printf("%d %d",i,j);//这样写也是可以的

10.循环判断语句(if switch),条件运算符 条件?表达式一:表达式二

第一种:if (条件) {
    代码块
    }
*两种不合格但又可以正常输出的语句bug
    int a = 65;
    if (60<=a<=70)
{
    {
        printf("及格\n");
//可以顺利输出及格,原因:由优先级条件语句60<=a<=70从左到右运算,
//a<=65为真这部分即为1,1<=70为真所有可以输出。但这是极不标准的!!!用逻辑表达式
}
if(a=64){
printf("及格\n");//也可以成功打印
}
-------------------------------------------------------------------------------------------------

第二种:if (条件) {
    代码块
    }else{
       代码块
}

------------------------------------------------------------------------------------------------
第三种(多个判断):if (条件) {
    代码块
    }else if(){
       代码块
}
int a=4;
switch(id)
{
case id://id必须是个整形常量表达式,且不可重复。1+2(符合),1+a(报错)。不能为小数(浮点型),一般浮点型男衣精确比较
语句;
break;//执行到没break的语句,会往下继续执行
·······
default://可以不写
语句;
}

goto: step;
step:
语句代码;


11.浮点数的比较,对于两个浮点数a, b,如果要比较大小,那么常常会设置一个精度(不设置都是false),如果fabs(a - b) <= 1e-6,那么就是相等了(还有另一种情况,a b是同种浮点数类型,都是float或者double时,也是可以比较出来的)。 fabs是求浮点数绝对值的函数(接受参数为double类型)。类似的 判断大于的时候,就是if(a>b && fabs(a - b)>1e-6)。判断小于的时候,就是if(a 12.数组,数组格式,首字符为字母,下划线(不可为数字),数组名,字母数字下划线。%p是打印地址的, %x是以十六进制形式打印, 完全不同!!可以把数组的维度看成嵌套,二维数组就是在一维里又嵌套了一个一维数组

比较图

#include
#include
int main(void) {
    int arr[2];//8字节  暂时别超过120万个字节的大小,栈溢出
    int arr1[3] = { 1,2,3 };//三个
    printf("%d\n",sizeof(arr));
    printf("%p %p %p %d\n", arr,&arr[0],arr[1],&arr[0]+1==&arr[1]);//数组地址就是首地址,利用数组地址找下一个值,地址加一(偏移)即可

    int arr2[2][3] = { {1,2,3},{1,2,5} };
    //int arr3[2][] = { { 1,2,3 },{ 1,2,5 } };//报错
    int arr4[][3] = { { 1,2,3 },{ 1,2,5 } };//通过,不报错
    printf("%p %p %p\n", arr2, &arr2[0][0],arr2[0]);//三个值都相等  二维数组名的地址,与第一个数组相等。首地址一致的,多维数组同样如此

    //数组间的赋值,法一用循环单个赋值,法二用
    memcpy(arr1,arr2,sizeof(int)*2);//把arr2的两个int长度的数,赋值给arr1,需引入memory.h
    memcpy(&arr1[0], &arr2[0], sizeof(int) * 2);//同上从首地址开始,改地址偏移从其它的地址开始
    memcpy(&arr2[0][0], &arr4[0][0], sizeof(int) * 6);//6为行和列相乘
    printf("\n%d %d\n", arr2[0], arr2[0][1]);//arr2[0]输出10进制的地址
    printf("%d %d",arr1[0], arr1[1]);
    getchar();
    return 0;
}

你可能感兴趣的:(C语言学习笔记(一))