zoukankan      html  css  js  c++  java
  • C语言语法记录

    1 break的范围

    执行break后,跳出最近的一个for循环语句或者最近的while,谁离break近,就从那里跳出来。

    2 malloc用法

    创建一个数组,并分配空间。

    int * a;
    a = (int *)malloc(sizeof(int) * 2);

    3 定义链表

    node *head = NULL, *p, *tail = NULL;
    p = (node *)malloc(sizeof(node));
    if(head == NULL)
        head = p;
    else
        tail -> next = p;
    p -> num = n;
    p -> next = NULL;
    tail = p;

    p、tail、head这些都是节点的名称,是一个指针变量,变量的内容是地址。

    开始的疑惑:执行下面两行代码后,会不会产生什么混乱?

    tail -> next = p;
    tail = p;

    以上两行代码都是指针变量,它们的内存空间大小都是相同的,是四个字节。

    存放的内容就是地址。

    malloc开辟的空间,可以存放一个结构体,而p只是指向这个空间 。

    创建含有头节点的单链表如下所示:

    struct ListNode* p_new = NULL;
    struct ListNode* p_tail = NULL;
    struct ListNode* p_head;
    p_head = new struct ListNode;
    p_head -> next = NULL;
    p_head -> val = 0;
    p_tail = p_head;
    for(int i = 0; i < (count1 + count2); i++)
    {            
         p_new = new struct ListNode;
         p_new -> val = a[i];
         p_new -> next = NULL;
         p_tail -> next = p_new;
         p_tail = p_new;
    }
    return p_head -> next;    

    4 结构体中 . 与 -> 

    p -> num相当于(*p).num

    5 数组要有结束符

        char *s2;//存放最长回文子串
        s2 = (char *)malloc(sizeof(char) * (n2 + 1));
        for(i = 0; i < n2; i++)
        {
            s2[i] = s[p1 + i];
        }
        s2[i] = '';//这个结束符至关重要

    6 标志位要及时置位

            while(count != 0)
            {
                for(m = i + 1, n = p[count] - 1; m <= n; m++, n-- )
                {
                    if(s[m] != s[n])
                    {
                        flag = 1;
                        break;
                    }
                }
                
                if(flag == 0)
                {
                    if(n2 < (p[count] - i + 1))
                    {
                        n2 = p[count] - i + 1;
                        p1 = i;
                    }
                    break;
                }
                count--;
                flag = 0;//这个flag要及时置位,不然第一次flag= 1后,执行一次if语句,后面的再也不会再执行上面的if判断语句了
            }
            count = 0;
            flag = 0;
            
        }

    7 找字符串中子串这一类题

    注意子串只有1个字符的这种特殊情况;

    注意字符串是否有空格;

    注意是否为空字符串。

    8 用变量定义数组大小

    数组的大小不能是一个变量,但可以用malloc动态分配。

    int a[n];//这样定义是错误的,其中n是一个变量
    //正确做法如下
    int *a;
    a = (int *)malloc(sizeof(int) * n);

    9 不同变量内存分配的字节数

    编译环境:LeetCode

    使用sizeof(类型)进行测试,测试结果如下表所示。

    类型 所占字节数
    char 1
    short 2
    int 4
    long 8
    long long 8
    float 4
    double 8

    10 位操作

    期望:通过位操作,取负数的绝对值。

    测试程序如下:

    #include <stdio.h>
    
    int main(void)
    {
        int a = -123;
        int b;
        b = a >> 2;
        printf("a = 0x%x,    %d
    ",a,a);
        printf("b = 0x%x,    %d
    ",b,b);
    }

    测试结果如下:

    a = 0xffffff85,    -123
    b = 0xffffffe1,    -31
    Press any key to continue

    预期:b的最高位为0

    通过测试结果可以看出,对于负数移位,并不是预期想的那样,而是直接/4。

    测试2:

    #include <stdio.h>
    
    int main(void)
    {
        unsigned int a = 1;
        unsigned int b;
        b = a << 31;
        printf("a = 0x%x,    %d
    ",a,a);
        printf("b = 0x%x,    %d
    ",b,b);
    }

    测试结果:

    a = 0x1,    1
    b = 0x80000000,    -2147483648
    Press any key to continue

    感受:对于位操作,在嵌入式中用来操作寄存器比较方便,但在C语言编程中容易出现意想不到的后果。

    11 不同变量能表示的范围

    对于int型,内存给它分配4个字节的空间,也就是32位。

    其中最高位表示符号:0为正;1为负。

    正数如下:

    0                                                              

    负数如下:

    1                                                              

    用正数和负数都可以表示0,如下图所示:

    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

    实际上把负数表示的0规定为int可表示的最小负数:-2^31

    int可表示的最大正数为:2^31 - 1

    12 正数与负数的最高位

    对于有符号的数据类型:

    最高位为0:正数;

    最高位为1:负数。

    13 if语句要注意的问题

    期望:

    x<0时flag = 1;

    x>0时flag = 0;

    编写程序如下:

            if(x < 0)
            {
                flag = 1;
                x = 0 - x;//这条语句又会满足下一条if条件语句
            }
            if(x > 0)
            {
                flag = 0;
            }

    最终无论x大于0还是x小于0,flag永远为0,要避免这种错误。

    14 数学函数的总结

    比如要求2^5,可用pow()函数:pow(2,5)。

    15 typedef与#define

    定义一个无符号短整型变量如下:

    unsigned short int a = 0;

    发现变量名特别长,当多个地方要定义这种类型的变量时,显得特别麻烦。

    于是可以用简洁的标识符代替繁长的变量类型,有如下两种方法:

    宏定义法:

    #define u16 unsigned short int

    typedef 关键字:

    typedef unsigned short int u16

    16 bool数

    数据类型符号:bool

    取值:true或者false

    17 数组首地址不能被赋值

    int a[2] = {2,4};
    int b[2] = {3,5};
    a = b;//不能这样赋值

    18 switch语句

    default关键字前没有case

    switch(s[i+1])
    {
      case 'I': temp2 = 1;break;
      case 'V': temp2 = 5;break;
      case 'X': temp2 = 10;break;
      case 'L': temp2 = 50;break;
      case 'C': temp2 = 100;break;
      case 'D': temp2 = 500;break;
      case 'M': temp2 = 1000;break;
      case default: temp2 = 0;break;//default前不要case
    }    

    19 一条语句判断两个数的大小

    return a > b ? a : b

    20 for语句

    两个判断条件要使用&&。

  • 相关阅读:
    eclipse下jsp文件报错解决方法
    使用vscode搭建本地的websocket
    tomcat的首次登录配置
    tomcat配置报错解决方法 The jre_home environment variable is not defined correctly
    cento升级openssl依旧显示老版本
    Centos6安装mysql5.7最新版
    Neutron服务组件
    网络OSI 7层模型
    Kubernetes的核心技术概念和API对象
    Xen 虚拟化技术
  • 原文地址:https://www.cnblogs.com/QQ2962269558/p/12770684.html
Copyright © 2011-2022 走看看