一,输入和输出
1,输出
int printf(const char *format, ...);
//参数:format ---- 字符串常量,表示输出的格式
//参数: ... ------ 变参,表示要输出的数据,数据的个数和类型都不固定
例如:
int main(void)
{
int a;
float b;
double c;
a = 120;
b = 43.21;
c = 43.21;
printf("%d\n",a);
printf("%f\n",c);
printf("%d,%f\n",a,b);
printf("a = %d,b = %f\n",a,b);
printf("%d\n",120);
printf("%d,%f\n",120,34.56);
printf("%d\n",a+100);
printf("%d%%\n",120);
return 0;
}
转换说明符的含义
%d 有符号十进制整数
%o 无符号八进制整数
%u 无符号十进制整数
%x 无符号十六进制整数
%c 一个字符
%s 字符串
%f 十进制计数法的浮点数
%e E-计数法的浮点数
%p 指针
在使用printf时需要注意以下几个问题:
1》转换说明符和变参的个数要相同
2》转换说明符和变参的类型要一致
3》输出的变参可以是常量,变量,表达式等
4》输出float数据和double数据时,都用%f
5》输出%时,需要用%%
//printf的修饰符
例如:
#include <stdio.h>
int main(void)
{
int a = 123;
float b = 12.34;
printf("%7d\n",a); //7-表示输出的数据最小的字段宽度为7
printf("%07d\n",a); //0-表示如果实际宽度不够7则在左边用0填充
printf("%-7d\n",a); //负号-表示左对齐
printf("%.2f\n",b); //.2 - 表示保留小数后2位
printf("%10.2f\n",b); //.2 - 表示保留小数后2位
printf("%d\n",-129);
printf("%+d\n",+120); //+ -在数据前显示+号
char c = 'A';
short s = 10;
long l = 100;
long long ll = 10000;
printf("%c\n",c);
printf("%hhd\n",c); // %hhd ---输出char型整数
printf("%hd\n",s); // %hd --- 输出short型整数
printf("%ld\n",l); // %ld --- 输出long型整数
printf("%lld\n",ll);// %lld --- 输出long long型整数
return 0;
}
2,输入
int scanf(const char *format, ...);
//参数:format ---- 字符串常量,表示输入的格式
//参数: ... ------ 变参,表示要输入的数据保存的数据地址,数据的个数和类型都不固定
例如:
int main(void)
{
int a;
float b;
double c;
char ch;
/*
//scanf("%d",&a); //&a --表示变量a的地址
scanf("%d%f%lf",&a,&b,&c);
//scanf("a=%d,b=%f",&a,&b); //不推荐使用
*/
scanf("%d%c%f",&a,&ch,&b);
printf("a = %d,b = %.2f,ch = %c\n",a,b,ch);
return 0;
}
当使用scanf时,需要注意以下几点:
1》转换说明符和变参的个数要相同
2》转换说明符和变参的类型要一致
3》输入的变参必须是变量的地址,或者内存空间的地址
4》输入float数据,则用%f,如果输入为double数据,则用%lf
5》如果输入多个数据时,数据之间需要用空白符隔开(空白符:空格,换行,tab)
6》如果输入数据中有字符,则字符和前面的数据之间不能用空白符隔开,必须紧挨着输入
//scanf的返回值
int main(void)
{
int a;
float b;
int ret;
printf("请输入a和b:");
ret = scanf("%d%f",&a,&b);
printf("ret = %d\n",ret);
printf("a = %d,b = %.2f\n",a,b);
return 0;
}
//运行结果:
farsight@farsight:~/2206/day02_code$ ./scanf02
请输入a和b:120 3.4
ret = 2
a = 120.b = 3.40
farsight@farsight:~/2206/day02_code$ ./scanf02
请输入a和b:120 r
ret = 1
a = 120.b = 0.00
farsight@farsight:~/2206/day02_code$ ./scanf02
请输入a和b:r 2.4
ret = 0
a = 21849.b = -0.00
二、运算符,表达式和语句
1,运算符
1》赋值运算:=
作用:将一个数值保存到某个变量中
左值:在赋值号左边的数据
必须时变量,表示该变量在内存中的空间
右值:在赋值号右边的数据
可以是常量,变量,表达式等,表示一个数值
例如:
int a,b,c;
a = 10;
b = a;
c = a + c;
2》算术运算: + - * / % ++ --
% ----- 取余数,两边的数据必须是整数。
++/-- ---- 自加1,或自减1,
例如:
int a = 4,b = 6,c;
c = a + b++; //先取出b的值,和a相加,然后赋给c,最后b自加1
或
c = a + ++b; //先对b自加1,取出b的值,和a相加,然后赋给c
3》逻辑(真假)运算: ! && ||
逻辑与:
表达式1 && 表达式2 结果
--------------------------
真 真 真
真 假 假
假 真 假
假 假 假
逻辑或:
表达式1 || 表达式2 结果
---------------------------
假 假 假
假 真 真
真 假 真
真 真 真
4》关系运算: > >= < <= == !=
作用:比较两个数大小,或者是否相等
关系运算的结果为逻辑值
例如:
int main(void)
{
int a,b,c;
bool bl;
a = 10;
b = a;
c = a + c;
bl = a > b;
printf("bl = %d\n",bl); //bl = 0
bl = a == b;
printf("bl = %d\n",bl); // bl = 1
return 0;
}
5》位运算: ~ & | ^ << >>
作用:按每个整数的二进制存储值的位进行运算
int main(void)
{
char a,b;
a = 5;
b = 3;
printf("~a = %hhd\n",~a);
printf("a & b = %hhd\n",a & b);
printf("a | b = %hhd\n",a | b);
printf("a ^ b = %hhd\n",a ^ b);
printf("a << 2 = %hhd\n",a<<2);
printf("a >> 2 = %hhd\n",a>>2);
printf("-6 >> 2 = %hhd\n",-6>>2);
return 0;
}
6》复合运算:把算术运算或位运算和赋值运算合并
例如: += *= |= &= 等
int a = 6, b = 3, c;
a = a + b; 可以使用复合运算:a += b;
7》条件运算: ? :
格式: 表达式1 ? 表达式2 : 表达式3
例如:
int a = 6;
int b = 3;
a > b ? a : b //运算过程:如果a > b 则结果为a,否则结果为b
8》逗号运算: ,
格式: 表达式1,表达式2,表达式3 //逗号运算结果取最后一个表达式的值
例如:
int a,b,c;
a = 4,b = 2, a+b //运算结果为6
例如:
int main(void)
{
int a,b,c;
c = (a=3,b=5,a+b);
printf("c = %d\n",c);
return 0;
}
9》sizeof运算
作用: 计算类型的长度或者计算数据占用内存的空间大小
例如:
int main(void)
{
long len;
len = sizeof(short);
printf("len = %ld\n",len);
len = sizeof(int);
printf("len = %ld\n",len);
len = sizeof(long);
printf("len = %ld\n",len);
len = sizeof(long long);
printf("len = %ld\n",len);
len = sizeof(float);
printf("len = %ld\n",len);
len = sizeof(double);
printf("len = %ld\n",len);
len = sizeof(long double);
printf("len = %ld\n",len);
short s;
int i;
float f;
len = sizeof(s);
printf("len = %ld\n",len);
len = sizeof(i);
printf("len = %ld\n",len);
len = sizeof(f);
printf("len = %ld\n",len);
return 0;
}
2,表达式和语句
1》表达式
所谓表达式就是指由运算符、运算量和标点符号组成的有效序列,其目的是用来描述一个计算过程。
每一个表达式都有一个运算的结果,该结果或者是数值,或者是逻辑值
表达式 值
-4+6 2
c=3+8 11
5>3 1
6+(c=3+8) 17
2》语句
表达式 + ; 就是语句,语句是c程序执行的最小单位
三,控制流 ------控制计算机执行程序的次序
1,循环控制
1》while语句
格式:
while(表达式){ //如果表达式为真,则执行一次循环体,如果表达式为假,则结束循环
要循环执行的代码
}
例如:
int main(void)
{
int age = 0;
while(age < 30){
printf("请输入你的年龄:");
scanf("%d",&age);
printf("你的年龄为%d\n",age);
}
return 0;
}
2》do-while语句
格式:
do{
要循环执行的代码
}while(表达式); //如果表达式为真,则执行一次循环体,如果表达式为假,则结束循环
例如:
int main(void)
{
int age = 0;
do{
printf("请输入你的年龄:");
scanf("%d",&age);
printf("你的年龄为%d\n",age);
}while(age < 30);
return 0;
}
3》for语句
格式:
for(表达式1 ; 表达式2 ;表达式3){ 先执行表达式1,然后判断表达式2,如果为真,则执行循环体,执行完循环体,则执行表达式3,然后再判断表达式2,如果表达式2位假,则退出
要循环执行的代码
}
例如:
int main(void)
{
int age;
for(age = 0; age < 20; age++){
printf("你的年龄为%d\n",age);
}
return 0;
}
2,分支控制
1》if语句
格式:
if(表达式){ //表达式为真,则执行,表达式为假,不执行
满足条件执行的代码
}
例如:
int main(void)
{
int age = 0;
while(1){
printf("请输入你的年龄:");
scanf("%d",&age);
printf("你的年龄为%d\n",age);
if(age < 18){
printf("未成年,禁止入内\n");
}
}
return 0;
}
2》if-else语句
格式:
if(表达式1){ //表达式1为真,则执行,表达式1为假,不执且判断表达式2
满足条件1执行的代码
}else if(表达式2){ //表达式2为真,则执行,表达式2为假,不执且判断表达式3
满足条件2执行的代码
.......
}else{
以上条件都不满足执行的代码
}
例如:
int main(void)
{
int age = 0;
printf("请输入年龄:");
scanf("%d",&age);
if(age < 0){
printf("输入错误!\n");
}else if(age < 18){
printf("未成年人,禁止入内!\n");
}else if(age < 45){
printf("欢迎观赏!\n");
}else{
printf("不宜过渡运动!\n");
}
return 0;
}
3》switch-case语句
格式:
switch(表达式){ //计算表达式的值
case 整型常量: //从第一个case开始,用表达式的值与case后的常量比较,如果相等则从该 case语句下面开始执行整个代码
代码块A
case 整型常量:
代码块B
........
case 整型常量:
代码块N
default:
代码块X
}
例如:
int main(void)
{
int day;
printf("请输入day:");
scanf("%d",&day);
switch(day){
case 1:
printf("今天是星期一!\n");
case 2:
printf("今天是星期二!\n");
case 3:
printf("今天是星期三!\n");
case 4:
printf("今天是星期四!\n");
case 5:
printf("今天是星期五!\n");
case 6:
printf("今天是星期六!\n");
case 7:
printf("今天是星期天!\n");
default:
printf("输入错误!\n");
}
return 0;
}
3,跳转控制
1》continue语句
只能用于循环语句中,表示结束某一次循环体的执行
例如:
int main(void)
{
int i;
i = 0;
while( i < 50){
i++;
if(i % 2 != 0)
continue; //从此跳转到while头部,执行下一次循环
printf("%d\n",i);
}
return 0;
}
2》break语句
跳出循环
例如:
int main(void)
{
int age = 0;
while(1){
printf("请输入你的年龄:");
scanf("%d",&age);
printf("你的年龄为%d\n",age);
if(age < 18){
printf("未成年,禁止入内\n");
break;
}
printf("欢迎光临!\n");
}
return 0;
}
跳出switch语句
int main(void)
{
int day;
printf("请输入day:");
scanf("%d",&day);
switch(day){
case 1:
printf("今天是星期一!\n");
break;
case 2:
printf("今天是星期二!\n");
break;
case 3:
printf("今天是星期三!\n");
break;
case 4:
printf("今天是星期四!\n");
break;
case 5:
printf("今天是星期五!\n");
break;
case 6:
printf("今天是星期六!\n");
break;
case 7:
printf("今天是星期天!\n");
break;
default:
printf("输入错误!\n");
}
return 0;
}
3》goto语句 -----无条件跳转
例如:
int main(void)
{
int age;
w:
printf("请输入你的年龄:");
scanf("%d",&age);
printf("你的年龄为%d\n",age);
goto e;
printf("hello world\n");
e:
printf("farsight\n");
return 0;
}
~