gg=G 将全部代码格式化

nG=mG 将第n行到第m行的代码格式化
== 自动缩进当前行

一.C语言中常用的数据类型
1.变量和常量
变量声明
类型 变量名
int a ;或者int a=10;
常量的声明
有2种方式
1.
#define 大写常量名 常量值 (注意后面没;)
比如 #define MY_NAME "hk" (字符串 双引号)
在预编译时 用常量的值 替换常量的名称
2.
const 类型 常量名(大写) = 常量值 ;(有分号;)
const int MY_AGE = 25;
运行时处理,好处是知道程序类型
见程序代码如下
type.c

#include <stdio.h>
#define MY_NAME "hk"
const int MY_AGE = 26;
int main(){
int a;
a=10;
printf("a =%d\r\n",a);
printf("my_name is %s\r\n",MY_NAME);
printf("my_age is %d\r\n",MY_AGE);
View Code

main函数默认返回的是int
没有明确的return时 最好指定 main的类型,否者会产生编译warning
预编译生成
gcc -E type.c -o type.i
在type.i 里可以看到 两种方式常量的处理

2.整型数据
int 4 字节
long int(int可省略) 32位os 4 字节 64位os 8字节
long long int(int可省略) 均8字节
short int(int可省略) 2字节 没有 short short
unsigned int ,unsigned long int (int可省略),unsigned long long int (int可省略)

short <= int <= long
2进制写法:ob开头 0b11表示 3
16进制:0x开头 0xAB表示10进制的171=10*16^1+11*16^0
8进制 以0开头 017 表示10进制的 1*8^1+7*8^0=15
为了统一标准 在c11里 stdint.h 里规定
int32_t,int64_t
int8_t,uint8_t
见程序代码如下 int.c

#include <stdio.h>
#include <stdint.h>
int main(){
    int a=10;
    long b=20;
    long int c=30;
    long long c1=40;
    short d=10;
    short int e=15;
    unsigned long long int ulli=111;
    printf("a=%d,b=%d,c=%d,c1=%lld,d=%d,e=%d,ulli=%lld\r\n",a,b,c,c1,d,e,ulli);
    printf("int=%d\r\nlong int=%d \r\nlong long=%d \r\nshort int=%d \r\n",sizeof(int),sizeof(long int ),sizeof(long long int) ,sizeof(short));
    printf("2 binary num=%d\r\n",0b11);
    printf("16 binary num=%d\r\n",0xAB);
    printf("8 binary num=%d\r\n",017);
    int32_t h=100;
    printf("h=%d\r\n",h);
a=10,b=20,c=30,c1=40,d=10,e=15,ulli=111
int=4
long int=4
long long=8
short int=2
2 binary num=3
16 binary num=171
8 binary num=15
h=100
View Code

注意,unsigned long long 型的输出必须%lld

3.实型数据
num.c

#include <stdio.h>
int main(){
        printf("float =%#d\r\n",sizeof(float)); 
        printf("double =%#d\r\n",sizeof(double));
        printf("long double=%#d\r\n",sizeof(long double));
        float a=1;
        double b=2.1;
        long double c=3.1;
        printf("a=%f,b=%f,c=%LF \r\n",a,b,c);
        printf("a=%F,b=%F,c=%lf \r\n",a,b,c);
        printf("a=%F,b=%F,c=%Lf \r\n",a,b,c);
        printf("ld =%d\n\r",sizeof c );
float =4
double =8
long double=16
a=1.000000,b=2.100000,c=3.100000
a=1.000000,b=2.100000,c=0.000000
a=1.000000,b=2.100000,c=3.100000
ld =16
View Code

sizeof 变量名 或者 sizeof (类型)
float,double的格式化输出 %f或者%F long double的格式化输出 L必须大写

字符型数据
\f 换页符
\b 退格符
\t 制表符

[root@centos1 c]# cat char.c
#include <stdio.h>
int main(){
 printf("hello\fworld\r\n");
 printf("hello\bworld\r\n");
[root@centos1 c]# ./char
hello
     world
hellworld
typedef 自定义类型
typedef int64_t my_long
[root@centos1 c]# cat typedef.c
#include <stdio.h>
#include <stdint.h>
typedef int64_t hk_long;
typedef uint8_t hk_char;
int main(){
        hk_long  a=1000;
        hk_char b='b';
        printf("a=%d\r\n",a);
        printf("b=%c\r\n",b);
[root@centos1 c]# ./typedef
a=1000
View Code

printf不会自动换行
输出字符或者字符串必须双引号,单引号会报错

#include  <stdio.h>
int main(){
   printf("p");
   printf("h\r\n");
   printf("p");
   printf("my");
   printf("sql");
[root@centos1 c]# ./printf
pmysql[root@centos1 c]#
#include  <stdio.h>
int main(){
   printf("p");
   printf("h\r\n");
   printf('p');
View Code

编译
[root@centos1 c]# gcc printf.c -Werror -o printf
cc1: warnings being treated as errors
printf.c: 在函数‘main’中:
printf.c:6: 错误:传递‘printf’的第 1 个参数时将整数赋给指针,未作类型转换
/usr/include/stdio.h:361: 附注:需要类型‘const char * __restrict__’,但实参的类型为‘int’

对于程序的检错
在编译时,可以用 -pedantic,-Werror,-Wall选项
-pedantic :够帮助程序员发现一些不符合 ANSI/ISO C标准的代码(并不是全部)
-Werror: 可以让gcc在编译中遇到错误时停止继续
-Wall: 让gcc显示警告信息

对于特殊字符输出
trans.c

#include <stdio.h>
int main(){
        printf("\\t\r\n");
        printf("\\r\\n\r\n");
        printf("\",\'\r\n");
        printf("?,\?\r\n");
        printf("\\\r\n");
        printf("\7\r\n");
[root@centos1 c]# ./trans
\7 在ACSII中代表一声短蜂鸣
View Code

格式化输出

%d         按照十进制整型打印
%hd   短整型整数(short int)
%ld   长整型整数(long int)
%lld   long long int
%6d        按照十进制整型打印,至少占6个位宽 ,如果给定的位宽比实际的小,则按照实际的输出
%03d  3位,不够左边补0
%u     无符号数字输出
%f         按照浮点数打印
%6f        按照浮点数打印,至少占6个位宽
%.2f    按照浮点数打印,小数点后有2位小数 多出的四舍五入
%6.2f    按照浮点数打印,至少占6个位宽,小数点后有2位小数
%p 指针
%o 八进制数 %#o 带前缀 %x 十六进制 %#x 带前缀 %c 表示字符 %s 表示字符串 %% 表示百分号本身 %e 以指数形式输出实数, %g 根据大小自动选f格式或e格式,且不输出无意义的零

默认都是右对齐,加-号表示左对齐 

#include <stdio.h>
#include <stdlib.h>
#define STRSIZE 32
#define SEC_YEAR (60LL*60LL*24LL*365LL)  //保证不会溢出
func(long i){
    printf("i=%d\n",i );
int main(){
    func(12L);//i=12
    float f =1234.56789;
    char str[STRSIZE] ="helloword";
    printf("f=%6.2f\n",f);//f=1234.57
    printf("str=%.5s\n", str); //str=hello
    printf("str=%5s\n", str);  //str=helloword
    printf("str=%10.5s\n",str);//str=     hello   //默认左边补空格
    printf("str=%-10.5send\n",str);//str=hello     end
    printf("num=%+d\n",10);//num=+10
    printf("num=%5d\n",12 );//num=   12
    printf("num=%05d\n",12 );//num=00012
    printf("i=%#x\n",255);//i=0xff
    printf("i=%#o\n",255);//i=0377
    //-----------------
  int a=1;
  float b=3.14;
  int c=10;
  printf("a=%d_\n",a); //a=1_
  printf("a=_%4d\n",a);//a=_   1
  printf("a=%-4d_\n",a);//a=1   _
  printf("a=_%d\n",1111);//a=_1111
  printf("b=%f\n",b); //b=3.140000
  printf("b=%4.3f\n",b);//b=3.140
  printf("c=%#x\n",c);//c=0xa
  printf("c=%x\n",c);//c=a
  printf("c=%#o\n",c);//c=012

字符
char a='@' ;必须单引号,不可以双引号,没有string 类型

#include  <stdio.h>
int main(){
        char c='@';
        char d='d';
        //string s="php";
        printf("c=%c,d=%c\r\n",c,d);
        //printf("s=%s",s);
#include  <stdio.h>
int main(){
      float money= 12.3456789;
        printf("money=%f\r\n",money);
[root@web c]# ./s
money=12.345679
#include <stdio.h>
#include <stdlib.h>
int main()
        int a1 = 1234, a2 = -1234;
        unsigned int b1 = 5678, b2 = -5678;
        printf("a1=%d, a1(u)=%u\n", a1, a1);
        printf("a2=%d, a2(u)=%u\n", a2, a2);
        printf("b1=%d, b1(u)=%u\n", b1, b1);
        printf("b2=%d, b2(u)=%u\n", b2, b2);
        return 0;
[root@web c]# ./u
a1=1234, a1(u)=1234
a2=-1234, a2(u)=4294966062
b1=5678, b1(u)=5678
b2=-5678, b2(u)=4294961618
View Code


无论变量声明为什么类型,只有当以 %u 格式输出时,才会作为无符号数处理;
如果声明为 unsigned 却以 d% 输出,那么也是有符号数

不管是否有符号: %o、%x、%X、%#o、%#x、%#X 都是以无符号形式输出

#include <stdio.h>
int main()
        unsigned int a = 0x100000000;
        int b = 0xffffffff;
        printf("a=%u, b=%d\n", a, b);
        return 0;
View Code
[root@web c]# gcc -o yi yi.c
yi.c: 在函数‘main’中:
yi.c:4:2: 警告:大整数隐式截断为无符号类型 [-Woverflow]
  unsigned int a = 0x100000000;
[root@web c]# ./yi
a=0, b=-1
View Code
c语言中运算符
<<,>>左右移位
[root@centos1 c]# cat w.c
#include <stdio.h>
int main(){
 int a=0b11;
 int b=0b01;
 printf("a=%d\r\n",a);
 printf("b=%d\r\n",b);
 printf("a&b=%d\r\n",a&b);
 printf("a|b=%d\r\n",a|b);
 printf("a^b=%d\r\n",a^b);
 printf("~a=%d\r\n",~a);
 printf("a<<1=%d\r\n",a<<1);
 printf("a>>1=%d\r\n",a>>1);
 printf("a>>2=%d\r\n",a>>2);
 printf("a<<2=%d\r\n",a<<2);
 // 交换a,b的值
 printf("a=%d\r\n",a^(b^a));
 printf("b=%d\r\n",b^(a^b));
[root@centos1 c]# ./w
a=3
b=1
a&b=1
a|b=3
a^b=2
~a=-4
a<<1=6
a>>1=1
a>>2=0
a<<2=12
a=1
b=3
View Code
对a=0b11取反
a占据4字节 32位 
 a=0000,0000,0000,0011
~a=1111,1111,1111,1100
是负数,均已补码方式存储的
补码:1111,1111,1111,1100
反码:1111,1111,1111,1011
原码:1000,0000,0000,0100
所以表示-4
正数的原码反码补码都一样
负数的反码等于除符号位外的1变0,0变1,补码=反码+1
运算操作符运算的是补码
位运算提取颜色通道
[root@centos1 c]# cat color.c
#include <stdio.h>
#include <stdint.h>
int main(){
        uint32_t color=0xFFFEFAFB;//ARGB
        uint32_t tmp=color&0x00FF0000;
        uint8_t red=tmp>>16;
        printf("%d\n",red);
[root@centos1 c]# ./color
View Code

输入与输出
输出字符和字符串
putchar();只能输出单字节的字符,必须单引号
puts();输出字符串或者字符,都必须双引号,结尾自动换行

[root@centos1 c]# cat char.c
#include <stdio.h>
int main(){
  putchar('a');
  putchar('\n');
  putchar(66);
  putchar('\n');
  putchar('\\');
  putchar('\n');
  char str[]="hello world";
  puts(str);
  puts("a");
[root@centos1 c]# ./char
hello world
[root@centos1 c]#
View Code
[root@centos1 c]# cat input.c
#include <stdio.h>
int main(){
        printf("please in put a char:");//只接收一个字符长度
        char input=getchar();
        printf("input:%c\r\n",input);
[root@centos1 c]# ./input
please in put a char:asc
input:a
[root@centos1 c]# cat scanf.c
#include <stdio.h>
int main(){
        printf("please input a int num:\r\n");
        int a;
        scanf("%d",&a);
        printf("input is :%d\r\n",a);
        printf("input is :%c\r\n",a);
[root@centos1 c]# ./scanf
please input a int num:
input is :66
input is :B
对于字符数组
[root@centos1 c]# ./scanf
please input a int num:
input is :0
input is :
[root@centos1 c]#
[root@centos1 c]# cat scanf1.c
#include <stdio.h>
int main(){
        char string[5];
        printf("please input a string:\r\n");
        scanf("%s",string);
        printf("input is:%s\r\n",string);
[root@centos1 c]# ./scanf1
please input a string:
abcdef
input is:abcdef
View Code

c语言数组
一维数组

[root@centos1 c]# cat arr.c
#include <stdio.h>
#include <stdint.h>
int main(){
        int32_t len=5;
        int32_t arr[len];
        for(int32_t i=0;i<len;i++){
                printf("index=%d;v=%d\r\n",i,arr[i]);
        int32_t arr1[]={1,3,5,7,9};
        for(int j=0;j<5;j++){
                printf("index1=%d;v=%d\r\n",j,arr1[j]);
[root@centos1 c]# gcc -o arr  -std=c99 arr.c
[root@centos1 c]# ./arr
index=0;v=1385677295
index=1;v=32765
index=2;v=1
index=3;v=0
index=4;v=0
index1=0;v=1
index1=1;v=3
index1=2;v=5
index1=3;v=7
index1=4;v=9
View Code [root@centos1 c]# cat arr1.c #include
<stdio.h> int main(){ int arr[3][4]={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12} //定义必须制定长度 for(int i=0;i<3;i++){ for(int j=0;j<4;j++){ printf("arr[%d][%d]=%d\t",i,j,arr[i][j]); if(j>0&&j%3==0){ printf("\r\n"); printf("\r\n"); int arr1[2][4]={ {1,2,3}, {6,7} for(int i=0;i<2;i++){ for(int j=0;j<4;j++){ printf("arr[%d][%d]=%d\n",i,j,arr1[i][j]); printf("\r\n"); [root@centos1 c]# ./arr1 arr[0][0]=1 arr[0][1]=2 arr[0][2]=3 arr[0][3]=4 arr[1][0]=5 arr[1][1]=6 arr[1][2]=7 arr[1][3]=8 arr[2][0]=9 arr[2][1]=10 arr[2][2]=11 arr[2][3]=12 arr[0][0]=1 arr[0][1]=2 arr[0][2]=3 arr[0][3]=0 arr[1][0]=6 arr[1][1]=7 arr[1][2]=0 arr[1][3]=0 carr.c #include <stdio.h> #include <string.h> int main(){ char str[10]="hello"; char str1[10]="he0llo"; char str2[10]={'h','0','e','\0','l','l','o'}; printf("char %s lenth=%d\r\n",str,strlen(str)); printf("char %s lenth=%d\r\n",str1,strlen(str1)); printf("char %s lenth=%d\r\n",str2,strlen(str2)); for (int i=0;i<strlen(str);i++){ printf("str[%d]=%c\r\n",i,str[i]); printf("###########\r\n"); for (int i=0;i<strlen(str1);i++){ printf("str1[%d]=%c\r\n",i,str1[i]); printf("###########\r\n"); for (int i=0;i<strlen(str2);i++){ printf("str2[%d]=%c\r\n",i,str2[i]); gcc -o carr carr.c -std=c99 [root@centos1 c]# ./carr char hello lenth=5 char he0llo lenth=6 char h0e lenth=3 str[0]=h str[1]=e str[2]=l str[3]=l str[4]=o ########### str1[0]=h str1[1]=e str1[2]=0 str1[3]=l str1[4]=l str1[5]=o ########### str2[0]=h str2[1]=0 str2[2]=e
View Code
2022-07-30:以下go语言代码输出什么?A:[]byte{} []byte;B:[]byte{} []uint8;C:[]uint8{} []byte;D:[]uin8{} []uint8。

这是一个bug,说正确答案应该是[]uint8{}[]uint8才对,因为byten8{}[]uint8。有人说是网络层,也有人说是数据链路层。...

  Redis内存淘汰指的是用户存储的一些键被可以被Redis主动地从实例中删除, Redis最常见的两种应用场景为缓存和持久存储 内存的淘汰机制的初衷是为了更好地使用内存,用一定的缓存miss来换取内存的使用效率。 通过配置redis.conf中的maxmemory这个值来开启内存淘汰功能 maxmemory为0的时候表示我们对Redis的内存使用没有限制。

by计数后取最大值 group mysql 取数据最大值

取数组中最大值可以先把思路理一下:将数组中第一个元素赋值给一个变量,并且把这个变量作为最大值;开始遍历数组,从第二个元素开始依次和第一个元素进行比较如果当前的元素大于当前的最大值,就把当前的元素值赋值给最大值移动到下一个元素,继续按前面一步操作当数组元素遍历结束时,这个变量存储的就是最大值代码如下:1 Array.prototype.max = function () { 2 // 将数