可以取man手册查看printf函数的原型
man 3 printf
&a; ----->取变量的地址
scanf获取数据的特点
scanf在获取多个数据时,以空格、tab键和回车作为数据分隔的标志
回车在每一个格式符都获取到数据后,回车作为scanf结束的标志,如果有格式符没有获取到数据,回车作为数据分隔的标志。
#include
int main(int argc, const char *argv[])
{
int a,b,c,d; //定义变量a不初始化
//终端获取变量的值
//scanf("%d,%d,%d,%d",&a,&b,&c,&d);
//scanf("%d%d%d%d\n",&a,&b,&c,&d);
scanf("%d%d%d%d",&a,&b,&c,&d);
printf("a=%d\n",a);
printf("b=%d\n",b);
printf("c=%d\n",c);
printf("d=%d\n",d);
return 0;
}
scanf吸收垃圾字符的问题
在使用scanf获取字符类型数据时,存在需要吸收垃圾字符的问题
因为空格、tab键和回车都是一个字符,会被%c获取到
利用scanf严格控制格式的特点,在双引号内添加空格,来达到吸收垃圾字符的效果。
#include
int main(int argc, const char *argv[])
{
char c1,c2,c3,c4;
//终端获取字符类型数据的值
scanf(" %c %c %c %c",&c1,&c2,&c3,&c4);
//每一个格式符前面的空格,都可以吸收空格、tab键和回车,如果没有空格、tab键和回车,就正常按照程序员的输入获取数据
//输出数据的值
printf("%c\n",c1);
printf("%c\n",c2);
printf("%c\n",c3);
printf("%c\n",c4);
return 0;
}
抑制字符是%*c
抑制字符必须吸收一个字符无论是否是垃圾字符
#include
int main(int argc, const char *argv[])
{
char c1,c2,c3,c4;
//终端获取字符类型数据的值
//scanf(" %c %c %c %c",&c1,&c2,&c3,&c4);
scanf("%c%*c%c%*c%c%*c%c",&c1,&c2,&c3,&c4);
//输出数据的值
printf("%c\n",c1);
printf("%c\n",c2);
printf("%c\n",c3);
printf("%c\n",c4);
return 0;
}
getchar()是一个从终端获取字符型数据的函数
#include
int main(int argc, const char *argv[])
{
char c1,c2,c3,c4;
//终端获取字符类型数据的值
scanf("%c",&c1);
getchar(); //获取两个字符数据间的垃圾字符
scanf("%c",&c2);
getchar();
scanf("%c",&c3);
getchar();
scanf("%c",&c4);
//输出数据的值
printf("%c\n",c1);
printf("%c\n",c2);
printf("%c\n",c3);
printf("%c\n",c4);
return 0;
}
putchar(变量名);
函数原型:
int putchar(int c);
功能:输出单个字符
参数:字符的ASCII码值或字符本身
返回值:int类型
#include
int main(int argc, const char *argv[])
{
char c1 = 'h';
putchar(c1); //输出h字符
putchar(10); //10是\n的ascii码值,输出换行
putchar('\n'); //输出字符'\n',就是换行
return 0;
}
getchar();
函数原型:
int getchar(void); --->getchar函数不需要参数,返回值为从终端获取数据的ASCII码
功能:输入单个字符
eg:从终端输入char c的值,
c = getchar();
#include
int main(int argc, const char *argv[])
{
char c1;
c1 = getchar();
putchar(c1); //输出h字符
putchar(10); //10是\n的ascii码值,输出换行
return 0;
}
类似于数学中的运算 + - * / %
#include
int main(int argc, const char *argv[])
{
printf("%d\n",10/4);
printf("%f\n",10.0/4);
printf("%f\n",(float)10/4); //用强制类型转换将10强转成float
//printf("%d\n",10.0%4);
printf("%d\n",10/4); //2
return 0;
}
++i、i++、--i、i--
++ii+1
++i:获取到的是i自增1
++i:获取到的是i自增1后的值,i本身发生改变
i++:获取到的是i自增前的值,i本身也发生了改变
--i:获取到的是i自减1后的值,i本身发生改变
i--:获取到的是i自减前的值,i本身发生改变
如果运算符在前面就获取运算后的结果,如果运算符在后面就获取运算前的结果。
#include
int main(int argc, const char *argv[])
{
int i=9;
printf("i++=%d\n",i++); //9
printf("i=%d\n",i); //10
printf("++i=%d\n",++i); //11
printf("i=%d\n",i); //11
int j = 10;
printf("%d\n",--j); //9,--运算符在前面获取运算后的结果
printf("j=%d\n",j);
//9
return 0;
}
a=b; --->将b的值赋值给a
a+=2; --->a=a+2;
a-=2; --->a=a-2;
a*=2; --->a=a*2;
a/=2; --->a=a/2;
a%=2; --->a=a%2;
#include
int main(int argc, const char *argv[])
{
int i=9;
/********************自增自减运算符***********************/
printf("i++=%d\n",i++); //9
printf("i=%d\n",i); //10
printf("++i=%d\n",++i); //11
printf("i=%d\n",i); //11
int j = 10;
printf("%d\n",--j);
printf("j=%d\n",j);
/*******************赋值运算符****************************/
printf("j-=2:%d\n",j-=2);
printf("i*=2:%d\n",i*=2);
int ret = (j*=2);
printf("ret=%d\n",ret);
return 0;
}
关系运算的结果是一个固定的值,真值/假值,1/0
计算机中非0为真,0为假
0.1(真值)
是C语言中的唯一一个三目运算符
表达式1?表达式2:表达式3
逻辑: 如果表达式1成立,执行表达式2,否则执行表达式3
#include
int main(int argc, const char *argv[])
{
int i=9,j=4;
printf("%d\n",ij:j); //1 ,--i是7 真值表达式成立,执行i>j
printf("i=%d\n",i); //7
printf("j=%d\n",j); //5
return 0;
}
逻辑运算的结果是真值/假值, 1/0
操作 |
逻辑 |
|
&&(逻辑与) |
表达式1&&表达式2 |
两个表达式同时为真,结果为真 |
||(逻辑或) |
表达式1||表达式2 |
只要有一个表达式为真,结果为真 |
!(逻辑非) |
!表达式 |
非真即假,非假即真 |
逻辑运算存在逻辑短路现象:
逻辑与运算时,如果运算符左侧的表达式结果为0,右侧的表达式不会执行
逻辑或运算时,如果运算符左侧的表达式结果为1,右侧的表达式不会执行
格式:
(表达式1,表达式2,表达式3,表达式4,····表达式n)
执行逻辑:
逗号运算符的每一个表达式都会执行,取最右侧表达式的结果
#include
int main(int argc, const char *argv[])
{
int i=6,j=7;
int ret = (i++,j--,i>j?i:j,--i);
printf("ret=%d\n",ret); //6
printf("i=%d\n",i); //6
printf("j=%d\n",j); //6
return 0;
}
sizeof说是C中的一个关键字也可以,sizeof的使用类似于函数调用的格式
格式:
sizeof(数据); --->数据可以是数据类型也可以是变量名也可以是常量
功能:
求()内内容所占的内存大小,以字节为单位
printf("%ld\n",sizeof(int));
printf("%ld\n",sizeof('c')); //计算ascii码值所占的大小,整数默认是int类型,结果是4
char w = 'c';
printf("%ld\n",sizeof(w));
对二进制位进行运算,bit位如果没有特殊说明,默认从最右侧一位开始是第0位
右移n位,表示除2^n
左移n位,表示乘2^n
操作 |
逻辑 |
|
>>(右移运算符) |
a>>n |
a向右移动n个bit位,高位补符号位 |
a |
a向左移动n个bit位,低位补符号位 |
|
^(异或) |
a^b |
a和b按位异或 同0异1 |
~(取反) |
~a |
每一个bit位按位取反 |
&(按位与) |
a&b |
两个bit位有一个0结果为0 两个都为1结果为1 |
|(按位或) |
a|b |
两个bit位只要有一个为1结果为1 两个都是0结果为0 |
#include
int main(int argc, const char *argv[])
{
printf("%d\n",7>>2);
//0111 >> 2 = 0001 抹掉最右侧两位,高位补符号位
printf("%d\n",1<<2);
//0001 << 2 = 0100 抹去最左侧的高位,低位补符号位
printf("%d\n",1^3); //同0异1
//0001
//0011
// 同0异1
//0010 = 2
printf("%d\n",1&3);
//0001
//0011
// 有一个0就是0
//0001
return 0;
}
位运算进场用来执行对某一位置0和置1的操作
eg:已知一个数a,想要给a的第13个bit置0,给a的第5个bit置1,要求操作不能修改其他bit位的值
a&=~(0x1<<13)
a|=(0x1
按位与运算可以实现对bit位置0的操作
按位或运算可以实现对bit位置1的操作
单算移关与,异或逻条赋
如果不想记优先级顺序,加括号
后缀自增和后缀自减的优先级更高
1、顺序结构:代码从上到下顺序执行
2、分支结构
3、循环结构
if(条件表达式)
{ --->建议大家在写if时,两个{}都单独占一行
条件成立执行的代码块;
}
if语句的{},在代码块中只有一条语句的情况下可以不写。
if(1)
{
printf("test\n");
} ------>可以不写的情况
if(1)
{
printf("test\n");
printf("1\n");
} ------>不能不写{},如果不写{},只有test的输出是和if有关的,1无论条件是否成立都会输出
if(0)
printf("test\n");
printf("1\n"); ---->会输出和条件是否成立无关
满足条件执行一段代码,不满足条件执行另一段代码
if(条件)
{
满足条件执行的语句块;
}
else
{
不满足条件执行的语句块;
}
if(条件1)
{
满足条件1执行的语句块;
}
else if(条件2)
{
不满足条件1,但是满足条件2执行的语句块;
}
else if(条件3)
{
不满足条件1,也不满足条件2但是满足条件3执行的语句块;
}
#include
int main(int argc, const char *argv[])
{
int a=70;
a=(a&~(0x1<<6));
printf("a=%d\n",a); // a=22
a=70;
a=(a|(0x1<<4));
printf("a=%d\n",a); // a=86
a=70;
a=(a^(0x1<<5));
printf("a=%d\n",a); // a=102
return 0;
}
ubuntu@
#include
int main(int argc, const char *argv[])
{
int a;
scanf("%d",&a);
if(100>=a&&a>=90)
{
printf("成绩等级为A\n");
}
else if(90>a&&a>=80)
{
printf("成绩等级为B\n");
}
else if(80>a&&a>=70)
{
printf("成绩等级为C\n");
}
else if(70>a&&a>=60)
{
printf("成绩等级为D\n");
}
else if(60>a&&a>=0)
{
printf("成绩不合格\n");
}
else if(a>100||a<0)
{
printf("成绩不合理\n");
}
return 0;
}