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] = '\0';//这个结束符至关重要

 

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\n",a,a);
    printf("b = 0x%x,    %d\n",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\n",a,a);
    printf("b = 0x%x,    %d\n",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语句

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

posted on 2020-04-24 22:38  辉哥54110  阅读(160)  评论(0编辑  收藏  举报