1.数据类型 1.整型 32位操作系统占用 4字节 %d %#x %#o 短整型 short int 2字节 %hd 长整型 long int 8字节 %ld 长长整型 long long int 16个字节 %lld 字符型 char 1字节 %c c 语言数据类型 分为有符号和无符号 节省内存 int a = 100; // 有符号 32 位 第一位符号位 unsigned int b = 100 // 无符号 char c = 100; // 0 000 1010 存储范围 -128 - 127 // 符号位 unsigned char c = 10 // 0000 1010 存储范围0 - 255 测量数据类型的大小 sizeof(int/char/long) 有符号位存储形式 正数 就是以原码形式存在 13 0000 1101 负数如何存储 -13 以补码形式存储 原码转换成补码 取反+1 1000 1101 负数的原码 1111 0010 负数的反码 1111 0011 负数的补码 2.字符型 以单引号形式表现 字符型数以ASCII码进行存储 'a' '\n' '??)' 我们可以通过man ascii 来查阅 char a = 'A'; char a = 65; 3.字符串的存在形式 char *s = "abcd"; char s1[5] = "abcd"; 2.浮点型数据 它的存储和运算形式 比整数复杂 效率很低基本上是整型的20% float 单精度 输出格式%f 最小精确度 10^(-37) 最大值 10^38 double 双精度 输出格式%lf 最小精确度 10^(-307) 最大值 10^308 long double 长双精度 输出格式%llf 最小精确度 10^(-4931) 最大值 10^4932 3.布尔型数据 真 占用一个字节 bool a = 100; bool a = -100; bool a = 0.1; bool a = -0.1; bool a = true; // 标准写法 布尔值为假 bool a = 0; bool a = false; // 标准写法 4.数据类型转换 (4byte) char short int long float double long double 从小变大 强制转换 int a; 强制转换 (float)a; int a; char *p = (char *)&a 用户自己定义 隐形转换 int a = 1.414; 操作系统只会取整数值 1 小数会被抛弃 系统按照规定取值 int a = 100; char c = 'v'; float d = 1.2; a+b+d ---> float 5.常量的表现形式 100 整型 100L 长整型 100LL 长长整型 100ULL 无符号长长整型 /********************************标准输入和输出***************************/ 1.格式化输出IO函数 标准输出 printf stdout 显示屏 标准输入 scanf stdin 键盘 标准出错 perror stderr 显示屏 1.1 printf的使用方法 1.1.1printf("输出格式的规定",参数列表); 只输出字符串 没有额外参数 printf("hello world\n"); 1.1.2printf("输出格式",参数列表); char *s = "zhangfei"; printf("name is %s\n", name); int a = 100; printf("name is %s\t age is %d\n", name, age); 参数要跟规定的格式保持一致 %s 字符串输出 %c 单个字符输出 %d 整型输出 %x 十六进制输出 %o 八进制输出 %p 输出地址 %f 浮点型输出 %ud 无符号整型输出 %ld 长整形输出 %hd 短整型输出 %e 科学计数法输出 %.nf 小数点后n位输出 %mf 输出m位 以右对其 1.1.3标准输出是有缓冲区的 所以想要把输出 一定要把输出从缓冲读取到 缓冲区输出 遇到\n 则输出改行信息 1.2 snprintf 字符串拼接 char buf[32]; snprintf( buf, 32, "music is %s.mp3\n", "qilixiang"); music is qilixiang.mp3 会存储前32个字节放到 buf里面 2.1 标准输入 sacnf gets fgets getchar .... %s 他会默认读取下一个单词 hello world 他永远只读取第一个单词 hello scanf 遇到空格和换行符就会结束 scanf("输入格式",输入地址); 返回值 是成功输入的个数 我们在使用scanf 不要在输入格式中添加多余信息 sacnf 返回值 代表成功读取的信息 /****************************************运算符***************************************/ 1.算术运算符 + - * / % ++ -- a + b * c / d 运算顺序根据优先级来确定 ++ 把它理解成两个运算 a++ a = a + 1 a + 1 a++ ++a和a++ ++a 他是先自加 然后在做运算 a++ 先运算 然后再自加 2.逻辑运算符 逻辑运算符 两侧经常是表达式 表达式的结果分为真和假 || && ! 或 与 非 2.1 || 运算符 只要有一个表达式为真那么这个语句为真 只有两个表达式都为假 这个语句才为假 a = b = 1; if(a++ || b++) { printf("a = %d\t b =%d\n", a, b); // 2 1 } 2.2 && 运算符 只要有一个表达式为假那么这个语句就为假 只有两个表达式都为真 这个语句才为真 表达式一个数是个位数 if(10 > a > 0) 一定错误 if(a > 0 && a < 10) 正确 a = b = 0; if(a++ && b++ ) { } printf("a = %d\t b =%d\n", a, b); // 1 0 2.3 ! 真的表达式 取非就为假 假的变真 a = b = 1; if( !(a > b) ) { printf("真") } 3.位运算符 ~ 按位取反 | 按位或 & 按位与 ^ 按位异或 << 左移 >> 右移 基本上所有的位操作都发生在底层 因此底层我们数据基本上都是定义成无符号型 但是我们要参加面试 3.1 按位取反 -(n + 1) 取反规则1变0 0变1 char a = 3 0000 0011 原码 char a = -3 1000 0011 ~a = 1111 1100 补码 1111 1100 1111 1011 -3补码 1111 1101 补码 1000 0100 -4 ~a 0000 0010 2 3.2 按位或 位或规则 只要有一个为1 就为1 只有两个为0 才为0 char a = 3 0000 0011 char b = 4 0000 0100 a | b = 7 0000 0111 3.3 按位与 位与规则 只要有一个为0 就为0 只有两个为1 才为1 char a = 3 0000 0011 char b = 4 0000 0100 a & b = 0 0000 0000 3.4 按位异或 异或规则 相同为0 不同为1 char a = 3 0000 0011 char b = 4 0000 0100 c = a ^ b = 7 0000 0111 c ^ b = a 0000 0011 连续两次异或等于本省 3.5 左移操作 多出去数据丢弃 空缺的补0 unsigned char a = 3 0000 0011 a << 2 0000 001100 0000 1100 12 如果左移丢弃的数据为0 那么左移几位就相当于*2几次方 丢 补 右移操作 unsigned char a = 3 0000 0011 a >> 2 0000 00 0011 --> 0000 0000 0 右移负数 (开发中不存在 只存在面试题目) 知识全面性 char a = -3 11111101 补码 a >> 2 11111111 01 11111110 10000001 -1 左移右移操作你们只需要知道 多出去的丢弃 空出来的补0 开发中底层的数据基本上都是无符号型 不存在负数右移左移情况 4.赋值运算 左值 = 右值 注意 左值一定是可读可写 错误写法 char a[3]; a = 100; 数组名是地址常量 100 = a; 100 是一个常量 int const i; i = 100; i只读的变量 不能赋值 5.复合运算 它的优点是 相当于一步操作 效率提高 += -= *= /= %= |= a += 5 --> a = a + 5 a /= 5 a = a / 5 a |= 5 a = a | 5 .... 6.逗号运算 从左到右运算 以最右边的值作为结果 7.return 表示函数结束 可以返回值给调用者 释放一些函数资源处理一些善后工作 处理预处理函数清理缓冲区等 /*************************************控制流**************************************/ 1.选择语句 if(表达式1) 表达式是一个布尔值 非零即真 { 代码1 } else 可以省略 { 代码2 } if(表达式) if语句为真 则实行语句1 仅仅下一条语句生效 语句1; 语句2; // 只会发生一种清况 一旦有一个表达式成立 下面的语句不会执行 if(表达式1) { 代码段1 } else if(表达式2) { 代码段2 } ... else { 代码段3 } switch case 语句 switch(变量) { case 常量 : 代码1; break; case 常量 : 代码1; break; case 常量 : 代码1; break; defulat : 可以省略; } 2.循环语句 2.1 while(表达式) { 循环代码; } 只要表达式为真 就会执行循环代码 反之跳过循环代码 往下执行 2.2 do { 循环代码 }while(表达式); 先执行一遍代码段 再来判断表达式 如果为真 继续执行循环语句 如果为假则跳过 do { 一次性执行完 // 宏定义写在此处 保证宏函数正常执行 }while(0); continue; 退出此次循环 从下一次循环继续 break; 终止循环 直接跳出 2.3 for(表达式1;表达式2;表达式3) { 循环代码 } 第一步执行 表达式1 第二步执行 表达式2 根据表达式2的真假 真执行循环代码 继续执行表达式3 然后再次执行表达式2循环 如果为假 则直接跳过循环代码 执行下面语句 2.4 goto 语句 flag : 标签 goto flag; 跳到flag此处 goto 语句我们经常在上层不适用因为阅读性差 破坏代码整体性(破坏我们栈内存) 一般我们在做一些出错判断会使用goto
1.数据类型 1.整型 32位操作系统占用 4字节%d%#x %#o 短整型short int 2字节%hd长整型long int 8字节%ld长长整型long long int16个字节 %lld字符型char 1字节%cc 语言数据类型 分为有符号和无符号 节省内存 int a = 100; // 有符号 32 位 第一位符号位 unsigned int b = 100 // 无符号char c = 100; // 0 000 1010 存储范围 -128 – 127 // 符号位unsigned char c = 10 // 0000 1010 存储范围0 – 255 测量数据类型的大小 sizeof(int/char/long) 有符号位存储形式 正数 就是以原码形式存在 13 0000 1101负数如何存储-13 以补码形式存储 原码转换成补码 取反+11000 1101 负数的原码1111 0010 负数的反码 1111 0011 负数的补码 2.字符型 以单引号形式表现 字符型数以ASCII码进行存储 ‘a’ ‘\n’ ‘??)’ 我们可以通过man ascii 来查阅char a = ‘A’;char a = 65; 3.字符串的存在形式char *s = “abcd”; char s1[5] = “abcd”;
2.浮点型数据 它的存储和运算形式 比整数复杂 效率很低基本上是整型的20%float单精度输出格式%f最小精确度 10^(-37) 最大值 10^38double双精度 输出格式%lf最小精确度 10^(-307) 最大值 10^308long double长双精度 输出格式%llf 最小精确度 10^(-4931) 最大值 10^4932
3.布尔型数据 真 占用一个字节 bool a = 100;bool a = -100;bool a = 0.1;bool a = -0.1; bool a = true;// 标准写法布尔值为假bool a = 0;bool a = false;// 标准写法4.数据类型转换 (4byte)char short int long float double long double从小变大强制转换int a; 强制转换 (float)a; int a; char *p = (char *)&a用户自己定义 隐形转换 int a = 1.414; 操作系统只会取整数值 1 小数会被抛弃系统按照规定取值 int a = 100;char c = ‘v’;float d = 1.2;a+b+d —> float 5.常量的表现形式100 整型100L 长整型100LL 长长整型100ULL 无符号长长整型
/********************************标准输入和输出***************************/1.格式化输出IO函数标准输出printfstdout显示屏标准输入 scanfstdin键盘标准出错 perrorstderr显示屏
1.1 printf的使用方法1.1.1printf(“输出格式的规定”,参数列表);只输出字符串 没有额外参数 printf(“hello world\n”);
1.1.2printf(“输出格式”,参数列表);char *s = “zhangfei”;printf(“name is %s\n”, name);int a = 100;printf(“name is %s\t age is %d\n”, name, age);参数要跟规定的格式保持一致%s 字符串输出%c 单个字符输出%d 整型输出%x 十六进制输出%o 八进制输出%p 输出地址%f 浮点型输出%ud 无符号整型输出%ld 长整形输出%hd 短整型输出%e 科学计数法输出%.nf 小数点后n位输出%mf 输出m位 以右对其1.1.3标准输出是有缓冲区的所以想要把输出 一定要把输出从缓冲读取到缓冲区输出 遇到\n 则输出改行信息
1.2 snprintf 字符串拼接char buf[32];snprintf( buf, 32, “music is %s.mp3\n”, “qilixiang”);music is qilixiang.mp3 会存储前32个字节放到 buf里面
2.1 标准输入 sacnf gets fgets getchar ….%s 他会默认读取下一个单词 hello world 他永远只读取第一个单词 helloscanf 遇到空格和换行符就会结束scanf(“输入格式”,输入地址);返回值 是成功输入的个数 我们在使用scanf 不要在输入格式中添加多余信息
sacnf 返回值 代表成功读取的信息
/****************************************运算符***************************************/
1.算术运算符 + – * / % ++ —a + b * c / d 运算顺序根据优先级来确定++ 把它理解成两个运算 a++ a = a + 1 a + 1 a++++a和a++ ++a 他是先自加 然后在做运算 a++ 先运算 然后再自加
2.逻辑运算符逻辑运算符 两侧经常是表达式 表达式的结果分为真和假 || && !或 与 非
2.1 || 运算符 只要有一个表达式为真那么这个语句为真 只有两个表达式都为假 这个语句才为假 a = b = 1;if(a++ || b++){printf(“a = %d\t b =%d\n”, a, b); // 2 1}
2.2 && 运算符 只要有一个表达式为假那么这个语句就为假 只有两个表达式都为真 这个语句才为真
表达式一个数是个位数 if(10 > a > 0) 一定错误 if(a > 0 && a < 10) 正确
a = b = 0;if(a++ && b++ ){}printf(“a = %d\t b =%d\n”, a, b); // 1 02.3 ! 真的表达式 取非就为假 假的变真a = b = 1;if( !(a > b) ) {printf(“真”)}3.位运算符~按位取反|按位或& 按位与^ 按位异或<< 左移>> 右移
基本上所有的位操作都发生在底层 因此底层我们数据基本上都是定义成无符号型但是我们要参加面试 3.1 按位取反 -(n + 1) 取反规则1变0 0变1char a = 3 0000 0011原码char a = -3 1000 0011~a = 1111 1100 补码 1111 1100 1111 1011 -3补码 1111 1101补码 1000 0100 -4~a 0000 0010 23.2 按位或 位或规则 只要有一个为1 就为1 只有两个为0 才为0char a = 3 0000 0011char b = 4 0000 0100a | b = 7 0000 01113.3 按位与 位与规则 只要有一个为0 就为0 只有两个为1 才为1char a = 3 0000 0011char b = 4 0000 0100a & b = 0 0000 00003.4 按位异或 异或规则 相同为0 不同为1char a = 3 0000 0011char b = 4 0000 0100c = a ^ b = 7 0000 0111 c ^ b = a0000 0011连续两次异或等于本省
3.5 左移操作 多出去数据丢弃 空缺的补0 unsigned char a = 3 0000 0011 a << 2 0000 001100 0000 1100 12 如果左移丢弃的数据为0 那么左移几位就相当于*2几次方 丢补 右移操作unsigned char a = 3 0000 0011a >> 2 0000 00 0011 –> 0000 0000 0 右移负数 (开发中不存在 只存在面试题目) 知识全面性 char a = -3 11111101 补码a >> 2 11111111 01 11111110 10000001 -1 左移右移操作你们只需要知道 多出去的丢弃 空出来的补0开发中底层的数据基本上都是无符号型 不存在负数右移左移情况4.赋值运算 左值= 右值注意 左值一定是可读可写 错误写法char a[3];a = 100; 数组名是地址常量100 = a; 100 是一个常量int const i;i = 100; i只读的变量 不能赋值5.复合运算它的优点是 相当于一步操作 效率提高 += -= *= /= %= |=a += 5 –> a = a + 5
a /= 5 a = a / 5a |= 5 a = a | 5….6.逗号运算 从左到右运算 以最右边的值作为结果
7.return 表示函数结束 可以返回值给调用者释放一些函数资源处理一些善后工作 处理预处理函数清理缓冲区等/*************************************控制流**************************************/1.选择语句 if(表达式1) 表达式是一个布尔值 非零即真{代码1}else可以省略{代码2}
if(表达式)if语句为真 则实行语句1 仅仅下一条语句生效 语句1;语句2;
// 只会发生一种清况 一旦有一个表达式成立 下面的语句不会执行 if(表达式1){代码段1}else if(表达式2){代码段2}…else{代码段3}
switch case 语句 switch(变量){case 常量 :代码1;break;case 常量 :代码1;break;case 常量 :代码1;break;defulat:可以省略;}
2.循环语句 2.1while(表达式){循环代码;}只要表达式为真 就会执行循环代码 反之跳过循环代码 往下执行
2.2do{循环代码}while(表达式);
先执行一遍代码段 再来判断表达式 如果为真 继续执行循环语句如果为假则跳过 do{一次性执行完 // 宏定义写在此处 保证宏函数正常执行 }while(0);
continue; 退出此次循环 从下一次循环继续 break;终止循环 直接跳出
2.3for(表达式1;表达式2;表达式3){循环代码}
第一步执行 表达式1 第二步执行 表达式2 根据表达式2的真假 真执行循环代码 继续执行表达式3 然后再次执行表达式2循环如果为假 则直接跳过循环代码 执行下面语句2.4goto 语句 flag : 标签 goto flag; 跳到flag此处 goto 语句我们经常在上层不适用因为阅读性差 破坏代码整体性(破坏我们栈内存)一般我们在做一些出错判断会使用goto
原文地址:http://www.cnblogs.com/zlxxc/p/16898100.html