一 运算符
1.1 算术运算符
双目运算符:操作数为2(运算符的两边各有一个变量)
+ - * / %
单目运算符:操作数为1:(运算符边上只有一个变量)
++:自增,每次自增1
--:自减,每次自减1
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 300,b = 200;
printf("%d + %d = %d\n",a,b,a+b);
printf("%d - %d = %d\n",a,b,a-b);
printf("%d * %d = %d\n",a,b,a*b);
printf("%d / %d = %d\n",a,b,a/b);
//printf想要输出%本身,需要再加上一个%
printf("%d %% %d = %d\n",a,b,a%b);
float m = 12.64,n = 46.52;
printf("%f + %f = %f\n",m,n,m+n);
printf("%f - %f = %f\n",m,n,m-n);
printf("%f * %f = %f\n",m,n,m*n);
printf("%f / %f = %f\n",m,n,m/n);
//取余只能在两个整数之间,浮点型数据不能取余
//printf("%f %% %f = %f\n",m,n,m%n);
printf("*************************\n");
int i = 100,j,k = 200;
printf("i = %d\n",i);
i+1;
//j = i++; //i = i+1
//j = ++i;
printf("j = %d\n",j);
//j = ++i+ ++i+ ++i;
printf("i = %d,j = %d\n",i,j);
j = i++ +(++k);
printf("i = %d,k = %d,j = %d\n",i,k,j);
return 0;
}
练习:输入一个三位数,求个位,十位,百位的和
789 --->7 + 8 + 9 = 24
789 / 100 = 7
789 % 10 = 9
789 /10 %10 = 8
1.2 关系运算符
> >= < <= == != 用于表示表达式和表达式之间关系的
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 10,b = 20,c;
c = a > b;
printf("c = %d\n",c);
c = a < b;
printf("c = %d\n",c);
//关系运算符只要在控制语句中使用,判断条件是否成立
if(a > b)
{
printf("a > b\n");
}
else
{
printf("a <= b\n");
}
return 0;
}
1.3 逻辑运算符
!:逻辑反,原本表达式为真变为假,原本表达式为假变为真
&&:逻辑与:两个表达式都为真,才为真,只要有一个为假则整体为假
a > b && a > c //a > b 并且 a > c
||:逻辑或:两个表达式有一个为真则整体为真,都为假才为假
a > b ||a > c //a > b 或者 a > c
判断一个变量a的值是否在10到20范围内:
数学:10 <= a <=20
c语言:a >=10 && a <=20
判断一个变量a的值是否不在10到20的范围内:
数学:a < 10 或 a > 20
c语言:a < 10 || a > 20
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 100;
int b = a;
printf("b = %d\n",b);
b = !a; //真变假 非0变成0
printf("b = %d\n",b);
// int num = a > 100 && ++b; //短路原则[逻辑与]:从左往右计算,有一个表达式结果为0,则整体为假,右边表达式将不再计算
// printf("num = %d,b = %d\n",num,b);
int num2 = a >=100 || ++b; //短路原则[逻辑或]:从左往右计算,有一个表达式成立,则整体为真,右边所有表达式将不再计算
printf("num = %d,b = %d\n",num2,b);
return 0;
}
1.4 位运算符
~ 位逻辑反 1001 --> 0110
& 位逻辑与 1001 & 1111 ---> 1001,同为1则为1,否则为假
| 位逻辑或 1010 | 1111 ---> 1111,只要有一个为1,则为1,都为0才为0
^ 位逻辑异或 相同为0 ,不同为1 1101 ^ 1011-->0110
<< 左移 1001111 << 3 --->1111000
>> 右移 10011110 >> 4 -->00001001
#include <stdio.h>
int main(int argc, const char *argv[])
{
unsigned char m = 0x67,n = 0x3b;
unsigned char k;
//位逻辑反
k = ~m;
//m: 0110 0111
//~m: 1001 1000 = 0x98;
printf("k = %#x\n",k);
//位逻辑与
k = m & n;
//m: 0110 0111
//n: 0011 1011
//m & n 0010 0011 = 0x23
printf("k = %#x\n",k);
//位逻辑或
k = m | n;
//m: 0110 0111
//n: 0011 1011
//m | n 0111 1111 ->0x7f
printf("k = %#x\n",k);
//位逻辑异或
k = m ^ n;
//m: 0110 0111
//n: 0011 1011
//m ^ n 0101 1100 -->0x5c
printf("k = %#x\n",k);
//左移
k = m << 3;
//m: 0110 0111
//m << 3 0011 1000->0x38
printf("k = %#x\n",k);
//右移
k = m >> 3;
//m: 0110 0111
//m >> 3 0000 1100-->0x0c
printf("k = %#x\n",k);
return 0;
}
练习:
unsigned short num = 0
第一步:将1,3,5,7,9置为1
第二步:将2,4,6置为1
第三步: 将1,2,3 置为0
第四步:将11,12,13,14置为1
0000 0001 0111 1000
0011 1101 0111 1000
0011 1101 0111 1000
第五步:将10,13,15置为0
0011 1101 0111 1000
0010 1101 0111 1000
0010 1101 0111 1000
#include <stdio.h>
int main(int argc, const char *argv[])
{
unsigned short num = 0;
num = 0x155;
printf("num = %#x\n",num);
num = num | 0x17f;
printf("num = %#x\n",num);
num = num & 0x178;
printf("num = %#x\n",num);
num = num |0x3d78;
printf("num = %#x\n",num);
num = num &0x2d78;
printf("num = %#x\n",num);
return 0;
}
1.5 赋值运算符和赋值复合运算符
赋值运算符:=
左值 = 右值
注意:左值必须是变量,右值可以是变量也可以是常量
注意事项:
=:赋值
==:判断
赋值复合运算符:a = a + b --->a += b; a -= 1; //a = a-1
+=,-=,*= /= %=
1.6 条件运算符—三目运算符
语法格式:
表达式1?表达式2:表达式3
运行顺序:先执行表达式1,如果表达式1成立,则执行表达式2,否则执行表达式3.
相当于if...else语句
if(表达式1)
{
表达式2
}
else
{
表达式3
}
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 20,b = 30;
//int k = a > b ? a++ : b++;
//printf("a = %d,b = %d,k = %d\n",a,b,k);
// int k = (a = b) ? a++ : b++;
//printf("a = %d,b = %d,k = %d\n",a,b,k);
int k = (a = b ? a++ : b++);
//int temp = a;
//a = a + 1;
//return temp;
printf("a = %d,b = %d,k = %d\n",a,b,k);
return 0;
}
1.7 逗号运算符
语法格式:
a = (表达式1,表达式2,表达式3,...,表达式n);
执行顺序:先执行表达式1,再执行表达式2,直到表达式n执行结束,将表达式n的结果作为整个表达式的结果赋值给a
(逗号运算符必须使用括号)
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a = 10,b = 20,c;
c = (++a,++b,a = a+b,a++);
printf("a = %d,b = %d,c = %d\n",a,b,c);
return 0;
}
1.8 sizeof运算符
主要用于计算数据类型所占内存空间的大小
n = sizeof(数据类型/变量名) //n保存这个数据类型所占内存的字节数
#include <stdio.h>
int main(int argc, const char *argv[])
{
char a;
printf("sizeof(char) = %ld\n",sizeof(a));
printf("sizeof(char) = %ld\n",sizeof(char));
printf("sizeof(long) = %ld\n",sizeof(long)); //64位中占8个字节,32位占4个字节
return 0;
}
1.9运算符的优先级
第1优先级:各种括号,如()、[]等、成员运算符 . ;
第2优先级:所有单目运算符,如++、–、!、~等;
第3优先级:乘法运算符*、除法运算符/、求余运算符%;
第4优先级:加法运算符+、减法运算符-;
第5优先级:移位运算符<<、>>;
第6优先级:大于运算符>、大于等于运算符>=、小于运算符<、小于等于运算符<=;
第7优先级:等于运算符==、不等于运算符!=;
第8优先级:按位与运算符&;
第9优先级:按位异或运算符^;
第10优先级:按位或运算符|;
第11优先级:逻辑与运算符&&;
第12优先级:逻辑或运算符||;
第13优先级:三目条件运算符 ?: ;
第14优先级:各种赋值运算符,如=、+=、-=、*=、/= 等;
第15优先级:逗号运算,
注意:后置++(结合律:从左往右)的优先级要高于前置++和*(从右往左) *p++ *++q
原文链接:https://blog.youkuaiyun.com/qq_44605933/article/details/104235009
练习:输入三个数,按照从小到大排序
int a = 10,b = 5,c = 8;
....
a = 5,b = 8,c = 10;
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a,b,c;
printf("请输入三个数:\n");
scanf("%d %d %d",&a,&b,&c);
printf("排序前:a = %d,b = %d,c = %d\n",a,b,c);
int temp;
if(a > b)
{
temp = a;
a = b;
b = temp;
}
if(a > c)
{
temp = a;
a = c;
c = temp;
}
if(b > c)
{
temp = b;
b = c;
c = temp;
}
printf("排序后:a = %d,b = %d,c = %d\n",a,b,c);
return 0;
}
二 输入输出函数
2.1 getchar/putchar
#include <stdio.h>
int getchar(void);从终端获取一个字符
int putchar(int c);向终端输出一个字符
#include <stdio.h>
int main(int argc, const char *argv[])
{
int ch;
//ch = getchar();
//printf("ch = %c,%d\n",ch,ch);
int a,b,c;
a = getchar();
b = getchar();
c = getchar();
printf("a = %c %d\n",a,a);
printf("b = %c %d\n",b,b);
printf("c = %c %d\n",c,c);
return 0;
}
#include <stdio.h>
int main(int argc, const char *argv[])
{
//参数为字符
putchar('w');
putchar('\n');
//参数为字符的ascii值
putchar(97);
putchar(10);
//参数为变量
int a = 'c';
putchar(a);
putchar(10);
return 0;
}
2.2 gets/puts
#include <stdio.h>
char *gets(char *s); //从终端获取一个字符串
int puts(const char *s); //向终端输出一个字符串
#include <stdio.h>
int main(int argc, const char *argv[])
{
puts("helloworld");
char s[32] = "helloworld";
puts(s);
char buf[32];
gets(buf);
puts(buf);
puts("hello\0world");
puts("");
return 0;
}
2.3 printf()/scanf()
2.3.1 printf()
printf函数是一个行缓冲函数,先将内容写到缓冲区,满足一定条件后,才会将内存写入对应的文件或者流中。
刷新缓冲区的条件:
1.遇到\n会刷新缓冲区
2.程序结束会刷新缓冲区
3.缓冲区满也会刷新缓冲区(1024个字节)
4.手动刷新缓冲区fflush
5.当标准输入流和标准输出流一方要使用缓冲区时,另一方需要让出缓冲区。
#include <stdio.h>
int main(int argc, const char *argv[])
{
for(int i = 0 ; i < 1024;i++) //缓冲区满会刷新缓冲区
{
printf("i");
}
//fflush(stdout); //手动刷新缓冲区
int c;
scanf("%d",&c); //当一方要使用的时候,另一方需要让出缓冲区
//printf("helloworld");
while(1);
return 0;
}
#include <stdio.h>
int printf(const char *format, ...);
功能:向终端按照格式输出字符串
参数:
format:带格式要输出的内容
普通字符:原样输出
格式说明:%[修饰符]格式字符,用于指定输出格式
%d 32位有符号
%ld 64位有符号
%u 32位无符号
%o 8进制输出
%x 16进制输出
%f 单精度浮点型
%lf 双精度浮点型
%e 指数输出
%c 字符输出
%s 字符串输出
%% 输出%本身
附加格式字符:
#:用于不同进制的前导符
l:用于long或者double或者sizeof类型的数据
m: 设置输出的内容的宽度
0:当设置宽度后,默认右对齐,左边空格补0
-:将右对齐改成左对齐
.n:保留小数点后n位
...:可变参数,可以有,可以没有
返回值:输出的字节数
实例:
#include <stdio.h>
int main(int argc, const char *argv[])
{
int num = 356;
//设置输出的宽度为5
printf("%5d%5d%5d\n",num,num,num);
//0:右对齐补0
printf("%05d%05d%05d\n",num,num,num);
//:将右对齐改成左对齐
//:0不能用于左对齐的形式
printf("%-5d%-5d%-5d\n",num,num,num);
float f = 45.456789451321;
printf("f = %f\n",f);
//.15:保留小数点后15位
printf("f = %.15f\n",f);
return 0;
}
一 scanf
1.1 scanf的简单使用
头文件:#include <stdio.h>
原型:int scanf(const char *format, ...);
功能:按照格式从终端输入指定内容
参数:
format:含有格式字符的内容
格式字符:
%d: 有符号整型数据
%f:浮点型数据
%c:字符数据
%s:字符串数据
...
...:可变参,用来保存输入内容,一般传变量的地址
返回值:成功保存内容的个数
#include <stdio.h>
int main(int argc, const char *argv[])
{
/*
int num;
int ret = scanf("%d",&num);
printf("ret = %d,num = %d\n",ret,num);
*/
char buf[32];
//scanf("%s",buf);
//gets(buf);
scanf("%[^\n]",buf); //这个形式可以输入一个带空格的字符串,意思是知道找到换行符才结束输入
printf("buf = %s\n",buf);
return 0;
}
1.2 scanf按照格式输入
#include <stdio.h>
int main(int argc, const char *argv[])
{
#if 0
int num;
scanf("[%d]",&num); //scanf的第一个参数就是要在终端输入格式,
//所以如果自己设置了输入的格式,就必须按照自己的设定的格式输入,否则输入不成功
printf("num = %d\n",num);
#endif
int a,b,c;
//scanf("%d %d %d",&a,&b,&c); //数字和数字之间必须要加上空格,回车或者tab
//scanf("%d,%d,%d",&a,&b,&c); //数字和数字之间用逗号隔开
scanf("%d;%d;%d",&a,&b,&c); //数字和数字之间用分号隔开
printf("a = %d,b = %d, c = %d\n",a,b,c);
return 0;
}
1.3 scanf附加格式字符
m:设置输入的宽度,如果输入的内容超过设置的宽度,只会保存设置宽度的内容
*:抑制符,当前带有*的格字符输入的内容不会保存到与之对应的变量中,而是将下一个不带*的格式字符保存到之前的变量中。
#include <stdio.h>
int main(int argc, const char *argv[])
{
#if 0
int year,month,day;
//scanf("%d%d%d",&year,&month,&day);
scanf("%4d%2d%2d",&year,&month,&day);//将前四位数保存到第一个整型中,将后面两位保存到第二个整型中,将最后两位保存到最后一个变量中
printf("%d-%d-%d\n",year,month,day);
char buf[32];
scanf("%6s",buf); //只会保存前6个字节
printf("buf = %s\n",buf);
#endif
char a,b,c;
//scanf("%c%c%c",&a,&b,&c);
//处理垃圾字符
//方法1:使用抑制符
//scanf("%c%*c%c%*c%c",&a,&b,&c);
//printf("a = %c,b = %c,c = %c\n",a,b,c);
//方法2:使用空格隔开,这个可以处理所有的垃圾字符,非常方便
//scanf("%c %c %c",&a,&b,&c);
//printf("a = %c,b = %c,c = %c\n",a,b,c);
//方法3:getchar处理
scanf("%c",&a);
getchar();
scanf("%c",&b);
getchar();
scanf("%c",&c);
printf("a = %c,b = %c,c = %c\n",a,b,c);
return 0;
}
//处理垃圾字符的方式
方式1:getchar()
方式2:使用抑制符*
方法3:使用空格
练习:
int id;
char name[32];
//处理垃圾字符
getchar();
char sex;
int score;
//处理垃圾字符
char bg;
scanf();
...
printf("id = %d,name = %s,sex = %c,score = %d,bg = %c\n",id,name,sex,score,bg);
#include <stdio.h>
int main(int argc, const char *argv[])
{
int id;
char name[32];
char sex;
int score;
char bg;
#if 0
printf("请输入id:\n");
scanf("%d",&id);
printf("请输入姓名:\n");
scanf("%s",name);
printf("请输入性别:\n");
scanf("%*c%c",&sex);
printf("请输入分数:\n");
scanf("%d",&score);
printf("请输入是否有男女朋友(Y/N):\n");
scanf("%*c%c",&bg);
#endif
#if 0
printf("请输入id:\n");
scanf("%d",&id);
printf("请输入姓名:\n");
scanf("%s",name);
getchar();
printf("请输入性别:\n");
scanf("%c",&sex);
printf("请输入分数:\n");
scanf("%d",&score);
getchar();
printf("请输入是否有男女朋友(Y/N):\n");
scanf("%c",&bg);
#endif
printf("请输入id:\n");
scanf("%d",&id);
printf("请输入姓名:\n");
scanf("%s",name);
printf("请输入性别:\n");
scanf(" %c",&sex);
printf("请输入分数:\n");
scanf("%d ",&score);
printf("请输入是否有男女朋友(Y/N):\n");
scanf(" %c",&bg);
printf("id = %d,name = %s,sex = %c,score = %d,bg = %c\n",id,name,sex,score,bg);
return 0;
}
二 控制语句
2.1 概念
主要控制语句只要用于解决一些代码需要执行,另一些代码可能需要重复执行的问题
分类:
分支语句:
if...else...
switch...case...
循环语句:
goto
while
do...while...
for
辅助控制关键词:
goto
break
continue
return
2.2 if…else语句
if(表达式1) //如果表达式1成立,则执行语句块1,不成立,则执行语句块2
{
语句块1
}
else
{
语句块2
}
if(表达式1)
语句块1 //只对一行有效
else
语句块2
if(表达式1)
{
语句块1
}
else if(表达式2)
{
语句块2
}
else
{
语句块3
}
//if语句的嵌套
if(表达式1)
{
语句块1
}
else if(表达式2)
{
语句块2
if(表达式3)
{
语句块3
}
else if
....
}
else
{
语句块3
}
表达式1:
if(0) 假
if(1) 真
if(0.0000001) 真
if(a) --->if(a != 0)
if(!a) --->if(0 == a)
if(a = 0) //假
if(a = 1) //真
if(a = 8) //真
举例:大小写转换
在终端输入一个字符,大小写字母相互转换,字符6转为数字6,都不满足,输出错误信息。
A --->a
a --->A
'6' --->6
#include <stdio.h>
//生命周期:
//作用域:
int main(int argc, const char *argv[])
{
printf("请输入一个字符:\n");
char ch;
scanf("%c",&ch);
if(ch >= 'a' && ch <= 'z')
{
ch -= 32; //ch = ch -32;
printf("ch = %c\n",ch);
int num;
}
else if(ch >= 65 && ch <= 90)
{
ch += 32;
printf("ch = %c\n",ch);
}
else if(ch >= '0' && ch <= '9')
{
ch -= 48;
printf("ch = %d\n",ch);
}
else
{
printf("您输入的有误,请重新输入\n");
}
return 0;
}
2.3 switch…case…语句
switch..case..语句和if语句一样,也是分支语句,不过switch语句主要用于条件过多的情况。
2.3.1 格式
switch(变量或者变量表达式):注意:变量只能是字符或者数字
{
case 常量或者常量表达式1:
语句块1;
break;
case 常量或者常量表达式2:
语句块2;
break;
case 常量或者常量表达式3:
语句块3;
break;
...
default:
语句块n;
break;
}
#include <stdio.h>
int main(int argc, const char *argv[])
{
int num;
printf("***1.注册 2.登录 3.退出***");
printf(">>>");
scanf("%d",&num);
#if 0
if(num == 1)
{
...
}
#endif
switch(num)
{
case 1:
case 4:
printf("正在执行注册操作\n");
break;
case 2:
printf("正在执行登录操作\n");
break;
case 3:
printf("正在执行退出操作\n");
break;
default: //default后面的break可以不写
printf("输入有误!\n");
break;
}
return 0;
}
作业1:判断闰年还是平年(if…else)
输入年份,判断闰年还是平年
闰年:可以被4整除但是不能被100整除,或者能够被400整除的年
提示:整除:对其取余等于0
#include <stdio.h>
int main(int argc, const char *argv[])
{
printf("请输入年份:\n");
int year;
scanf("%d",&year);
if((0 == year % 4) && (0 != year %100) || (0 == year % 400))
{
printf("%d年是闰年\n",year);
}
else
{
printf("%d年是平年\n",year);
}
return 0;
}
作业2:两个数的运算
使用switch实现两个数的(+ - * /)
90 100
+
90 + 100 = 190
#include <stdio.h>
int main(int argc, const char *argv[])
{
int num1,num2;
char ch;
printf("请输入两个数字:\n");
scanf("%d %d",&num1,&num2);
printf("请输入运算符(+ - * /):");
scanf(" %c",&ch);
switch(ch)
{
case '+':
printf("%d + %d = %d\n",num1,num2,num1 + num2);
break;
case '-':
printf("%d - %d = %d\n",num1,num2,num1 - num2);
break;
case '*':
printf("%d * %d = %d\n",num1,num2,num1 * num2);
break;
case '/':
printf("%d / %d = %d\n",num1,num2,num1 / num2);
break;
default:
printf("您输入的字符有误!\n");
break;
}
return 0;
}