查漏补缺:
复制文件 cp
用到#include<math.h> 编译时加参数 -lm
共享文件夹路径: /mnt/hgfs/share/
编译步骤:
1.预处理 展开#开头代码(头文件,宏定义,条件编译)
2.编译 语法检查与把C代码翻译成汇编代码
3.汇编 把汇编语言编译成二进制文件
4.链接 链接程序需要用到的文件
今日学习:
1、基本数据类型
2、运算符与表达式
3、控制结构
4、循环语句
C语言效率较高->指针可以操作内存
* 指针 传地址
基本数据类型 空类型
字符型
数值型 实型 单精度
双精度
整型 短整型 无符号
有符号
整型 无符号
有符号
长整型 无符号
有符号
★整型不一定比短整型长
32位操作系统
整型int short :
整数, 4个字节 2个字节
单精度实型float
单精度浮点数,一般4个字节
双精度实型double
双精度浮点数,一般8个字节
字符型char
1个字节
内存单位:字节 8位
利用关键字sizeof查看数据占得字节数 一共32个关键字
short
范围 -32768~32767
unsigned short
范围 0~65535
字符型char
范围 -128~127 1个字节 8位
最大 01111111 2^7-1=127
00000000 0
11111111 -(2^7-1)=-127
最小 10000000 -128
unsigned char
范围 0~255 1个字节 8位
最大 11111111 2^8-1=255
最小 00000000 0
float
范围 3.4e-38~3.4e38
32位 1位符号位 23位尾数位 8位指数位 尾数位的值*10^指数位的值
字符是有符号整数
strlen() 库函数 求长度 #include<string.h>
\0 字符串结束标志 \ 转义字符
strlen 遇到 '\0'结束 <--或0结束--|
字符串后面默认有'\0' |
字符在内存中以ASCII形式存储 |
'a' 97 '0' 60 '\0' 0 即-|
%d 输出有符号整型
%u 输出无符号整型
#include<stdio.h>
#include<string.h>
int main()
{
char a[1000];
int i=-20;
for(i=0;i<1000;i++)
{
a[i]=-1-i;
// printf("%d ",a[i]);
}
// printf("\n");
printf("a changdu = %d\n",strlen(a));
return 0;
}
不同类型做运算
#include<stdio.h>
int main()
{
unsigned int j=10;
unsigned int c=3;
printf("i + j = %d\n",i+j);
printf("i + j = %u\n",i+j);
printf("c * 3 = %u\n",c * (-1));
return 0;
}
int a; char b; a+b
11111111111111111111111111111111 int 表示的范围大
11111111 char
所以运算时补零,将 char 转换成 int 即:
00000000000000000000000011111111 int
混合运算:转换成能表示范围更大的类型
无符号类型比有符号类型范围大,其从零开始,能表示的个数一样,所以范围大
负数以补码的形式存储,如-20
10000000 00000000 00000000 00010100
11111111 11111111 11111111 11111111 反码
11111111 11111111 11111111 11101100 补码(反码加一)
const修饰只读变量
const int a; 不能通过变量a修改对应内存的值
#地址 取第一个元素的地址
#include<stdio.h>
int main()
{
const int a=1;
int *p = (int *)&a; //用到了强制类型转换(cast)
*p = 3;
printf("a = %d\n",a); //可以通过指针修改a对应内存的值
return 0;
}
暂时不需要了解
const int *p; (*p)++;不合法
int * const q; q++;不合法
const int * const z; (*z)++;z++;都不合法
volatile防止编译时被优化
C的运算符有以下几类:
(1)算术运算符 (+ - * / %)
(2)关系运算符 (> < == >= <= !=) //尽量将(a == 0),写成(0 == a)
(3)逻辑运算符 (! && ||)
(4)位运算符 (<< >> ~ | ∧ &)
(5)赋值运算符 (=及其扩展赋值运算符)
(6)条件运算符 (?:) //又称三目运算符(有几个参数就是几目)
(7)逗号运算符 (,) //表达式1,表达式2 先求解表达式1,再求解表达式2,输出的是表达式2的值
(8)指针运算符 (*和&)
(9)求字节数运算符(sizeof)
(10)强制类型转换运算符( (类型) )
(11)分量运算符(.->)
(12)下标运算符([ ])
(13)其他 (如函数调用运算符())
函数符号() 数组下标[] ↑
单目运算符 |
算数运算符 |优
移位运算符 |先
关系运算符 |级
逻辑运算符 |
三目运算符 |
\n 换行 \t水平制表
'a'一个字符 "a\0"两个字节 创建数组时候创的大一点
gcc参数 -Wall 打开所有警告
g++ 编译命令c++
请编写一个c函数,该函数给出一个字节中被置为1的位的个数
#include<stdio.h>
int main()
{
char ch,i,count=0;
printf("Please input a char: \n");
scanf("%c",&ch);
for(i=0;i<8;i++)
{
if(ch & 1 == 1)
{
count++;
}
ch = ch >> 1;
}
printf("%d\n", count);
return 0;
}
输出结果:a b c
3 3 4 //输入a,输出3,再执行一次输入b,..,这么写结果只是为了更直观看
i++与++i的区别:
++i是先执行i=i+1后,再使用i的值;
i++是先使用i的值后,再执行i=i+1。
int a = 4; //默认每条语句a = 4,输出a的值
a+=a++; a = 9 |a=4+4+1
a+=++a; a = 10 |a=5+5
++a+=a; a = 10 |a=5+5
++a+=a++; a = 11 |a=5+5+1
++a+=++a; a = 12 |a=6+6
运算时候有 a++ 先不管++
++a 直接算出a
条件运算符与逗号运算符
#include<stdio.h>
int main()
{
int num1, num2, max, min, i=1;
printf("Please input two numbers: \n");
scanf("%d%d",&num1,&num2);
max = (num1>num2)? num1: num2; //括号里判断,成立输出第一个,否则输出第二个
min = (num1<num2)? num1: num2;
printf("max = %d\tmin = %d\n", max, min);
printf("first i++,i = %d\n", i++); //输出:1
printf("second ++i,i = %d\n", ++i); //输出:3
i=1;
printf("i= %d\n",i);
printf("first ++i = %d\n", ++i); //输出:2
printf("second i++ = %d\n", i++); //输出:2
return 0;
}
分析一个程序
每条语句用分号“;”结束。
不是语句的,不能以分号结束,如预处理命令。
格式输出函数
printf(格式控制字符串, 输出项表列);
格式输入函数
scanf(格式控制字符串, 地址表列);
%d或%i 按十进制有符号整数输出,正数的符号省略
%u 按十进制无符号整数输出
%o 按八进制无符号整数输出(不输出前导0)
%x或X 按十六进制无符号整数输出(不输出前导符0x)
%c 按字符型数据输出
%s 按字符串数据输出
%f 按小数形式输出(6位小数)
%p 16进制输出地址
%7.3f 7控制输出的长度 3控制小数点后的尾数
if语句switch语句的计算器
#include<stdio.h>
int main()
{
char opt;
float num1, num2, result;
printf("Please input: \n");
scanf("%f%c%f", &num1, &opt, &num2);
/* if('+' == opt )
{
result = num1 + num2;
}
else if('-' == opt)
{
result = num1 - num2;
}
else if('*' == opt)
{
result = num1 * num2;
}
else
result = num1 / num2;
*/
switch(opt)
{
case '+':result = num1 + num2;
break;
case '-':result = num1 - num2;
break;
case '*':result = num1 * num2;
break;
case '/':result = num1 / num2;
break;
default :printf("error!\n");
break;
}
printf("result= %.2f\n", result);
return 0;
}
while (表达式) 语句
当表达式为非0值时,执行while语句中的内嵌语句。其特点是:先判断表达式,后执行语句。
do
循环体语句
while (表达式);
do-while语句的特点:先执行循环体,然后判断循环条件是否成立
for语句一般形式:
for(表达式1;表达式2;表达式3) 语句4
1243243243
continue语句
作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定.
一般形式: continue;
break语句
break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句
一般形式: break;
注意:break语句不能用于循环语句和switch语句之外的任何其他语句中。
循环嵌套 涉及到跨切
在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU 跨切循环层的次数;
如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面;