前言
C语言学习笔记
课程:郝斌C语言
书籍:《C程序设计(第五版)》
一、预备知识
1.常用数据类型
常用基本数据类型
2.初始化
初始化即赋值的意思
-
类型 变量名 = 赋值 ;
-
数据类型 变量名;
变量名 = 赋值;
进制及其转换:
十进制转二进制:除2取余,直至商零,余数倒序排列。
二进制转十进制:从右至左,按位乘以十的n次方,积相加。
二进制转八进制:从右至左,三位一段,分别转换,不足三位的补零。
二进制转十六进制:从右至左,四位一段,分别转换,不足四位的补零。
3.运算符
优先级:算术>关系>逻辑>赋值
算术运算符:+(加)、-(减)、*(乘)、/(除)、% (取余)
举例:
整数/整数=整数
浮点数/整数=浮点数
关系运算符:>(大于)、>=(大于等于)、 < (小于)、
<=(小于等于)、!= (不等于)、==(等于)
赋值运算符:= 、+= 、*=、 /= 、-=
逻辑运算符:!(非)、&&(并且)、||(或)
位运算符:&(按位与)、|(按位或)、^(按位异或)、~(按位取反)、>>(按位右移)、<<(按位左移)
1&1=1 ; 1|1=1 ; 1^1=0 ;
1&0=0 ; 1|0=1 ; 1^0=1 ;
0&1=0 ; 0|1=1 ; 0^1=1 ;
0&0=0 ; 0|0=0 ; 0^0=0 ;
位运算符的现实意义:对数据的操作精确到每一位。
按位左移<<:若数据不丢失,左移n位相当于乘以2的n次方
// i=i*8;
// i=i<<3; //执行更快
i<<3;//相当于将 i 的所有二进制位左移三位,右边补零。
按位右移<<:若数据不丢失,右移n位相当于除以2的n次方
// i=i/8;
// i=i>>3; //执行更快
i>>3;//相当于将 i 的所有二进制位右移三位,左边一般补0,有时补1。
补充:
自增 / 自减(以自增为例)
分类: 前自增++i、后自增i++
相同点:使 i 值加1
不同点:
++i 整体表达式为 i 加 1 后的值
i ++ 整体表达式为 i 加 1 前的值
优点:代码更精炼,自增(减)更快。
i++ 和 ++i单独成一个语句,尽量不要将其作为一个完整复合语句的一部分使用
三目运算符
A ? B : C
相当于:
if(A)
B;
else
C;
逗号表达式
(A,B,C,D)
功能:从左至右执行,最终表达式的值是最后一项的值。
4.补码
a.正整数转二进制
b.负整数转二进制
c.零转二进制:全是零
a.除2取余,直至商零,余数倒序排列。
b.先求对应整数绝对值的二进制代码,然后将所有位取反,末尾加1,不够位数时左边补1
# include <stdio.h>
int main (void)
{
int i = -3;
printf("%#x\n",i);
return 0;
}
/*输出结果为:0xFFFF FFFD */
-3 :011 → 100 → 101 → 1111 1111 1111 1111 1111 1111 1111 1101(0XFFFF FFFD)
已知二进制求十进制
若首位为0,为正整数,按常规方法求取。
若首位是1,则为负整数:将所有位取反,末尾加1,得该复数的绝对值。
二、流程控制
代码执行顺序
1.选择
if
比较以下 if () 的作用范围
if(A) // A为条件表达式;
B; // A成立,则执行B语句,否则不执行;
C; // 无论A是否成立,都会执行C语句
if(A)
{
B;
C;
} //仅A成立才执行B、C语句
if(a)
A; //仅a成立才执行A语句
else if(b)
B;
……
else N;
空语句问题:
if (3>2);
等价于
if (3>2)
;//空语句
2.循环
for
for (1;2;3) 语句A;
代码执行顺序:1→2→(yes)→A→3→2→(yes)/(no)→继续循环/结束循环
/******************************************************************
求1+1/2+1/3+……+1/100的值
*****************************************************************/
# include <stdio.h>
int main (void)
{
int i;
float sum =0;
for (i=0;i<=100;++i)
{
sum = sum + 1.0/i;
}
printf("sum=%f\n",sum);
return 0;
}
float 和 double都无法精确存储小数
while
/******************************************************************
用while判断是否回文数
*****************************************************************/
#include <stdio.h>
int main(void)
{
int val,m,sum=0;
printf("输入需判断的数:\n");
scanf("%d",&val);
m=val;
while(m)
{
sum=sum*10+m%10;
m/=10;
}
if(sum==val)
printf("yes!\n");
else
printf("no!\n");
return 0;
}
for和while的关系
for 和while相互转化,但for的逻辑性更强
for(语句1;语句2;语句3)
A;
等价于
语句1;
while(语句2)
{
A;
语句3;
}
总结
未完待续。