目录
1、标准输入函数(scanf)和标准输出函数(printf)
注:使用scanf和printf需要引入库文件stdio.h
在Linux系统中使用命令man 3 printf或者man 3 scanf命令来查看具体详情
本文主要讲解的时C语言中的scanf函数和printf函数,了解其他的输入输出可以去c语言 | 菜鸟教程
链接https://www.runoob.com/cprogramming/c-input-output.html
1.1标准输出函数(printf)
标准输出函数printf,作用是将参数1输出到屏幕上;参数1中如果有格式化符号,就需要传入对应的值或者变量替换候输出
标准输出函数原型:int printf(const char* format, ...);
说明:
format:是一个字符串类型,字符串中可以有以%开头的格式化符号,还有非格式化 符(普通字符),还会有转义字符\n
...:可变形式参数,可以有0个或多个;具体数量要和格式化符的数量一致
printf在使用时建议在format的末尾加上换行符\n;
\n:换行符可以将输出缓冲区的数据刷新到屏幕上
1.2标准输出函数(scanf)
标准输入函数scanf,作用是将键盘输入的内容存到变量中
标准输入函数原型:int scanf(const char* format, ...);
说明:
format:是字符串类型的,可以写格式化符号,也可以写普通字符,还可以写 转义字符
...:可变形式参数,有多少格式化符就要有多少变量,并且变量前必须加& (取地址符)
注意:scanf在使用时,建议format中只写格式化符,并且不要带换行符\n
scanf在输入字符时,建议格式化符中只写
//标准输入函数和标准输出函数
#include<stdio.h>
int main()
{
//定义变量
/*
int a;
int b;
int c;
*/
//一条语句定义三个变量
int a,b,c;
printf("a = %d\tb = %d\tc = %d\n",a,b,c);
//标准出入函数
scanf("%d%d%d",&a,&b,&c);
printf("a = %d\tb = %d\tc = %d\n",a,b,c);
return 0;
}
1.3标准输入连续字符或者数字于字符杂糅输入的解决
1.3.1使用scanf来接收空格
若不处理该问题会出现输入的数据不匹配现象
ynl@ynl:~/C_code/inClass/6m4r$ cat demo0.c
//标准输入函数和标准输出函数
#include<stdio.h>
int main()
{
//定义变量
/*
int a;
int b;
int c;
*/
//一条语句定义三个变量
/* int a,b,c;
printf("a = %d\tb = %d\tc = %d\n",a,b,c);
//标准出入函数
scanf("%d%d%d",&a,&b,&c);
printf("a = %d\tb = %d\tc = %d\n",a,b,c);
*/
char a,b,c,tmp;
scanf("%c%c%c",&a,&b,&c);
printf("a = %c-----%d\tb = %c-----%d\tc = %c-----%d\n",a,a,b,b,c,c);
return 0;
}
ynl@ynl:~/C_code/inClass/6m4r$ gcc demo0.c
ynl@ynl:~/C_code/inClass/6m4r$ ./a.out
A B C
a = A-----65 b = -----32 c = B-----66
定义一个临时变量,来接收空格或换行。
ynl@ynl:~/C_code/inClass/6m4r$ cat demo0.c
//标准输入函数和标准输出函数
#include<stdio.h>
int main()
{
//定义变量
/*
int a;
int b;
int c;
*/
//一条语句定义三个变量
/* int a,b,c;
printf("a = %d\tb = %d\tc = %d\n",a,b,c);
//标准出入函数
scanf("%d%d%d",&a,&b,&c);
printf("a = %d\tb = %d\tc = %d\n",a,b,c);
*/
char a,b,c,tmp;
// scanf("%c%c%c",&a,&b,&c);
scanf("%c",&a);
scanf("%c",&tmp);
scanf("%c",&b);
scanf("%c",&tmp);
scanf("%c",&c);
scanf("%c",&tmp);
printf("a = %c-----%d\tb = %c-----%d\tc = %c-----%d\n",a,a,b,b,c,c);
return 0;
}
ynl@ynl:~/C_code/inClass/6m4r$ gcc demo0.c
ynl@ynl:~/C_code/inClass/6m4r$ ./a.out
A B C
a = A-----65 b = B-----66 c = C-----67
ynl@ynl:~/C_code/inClass/6m4r$
1.3.2使用getchar()函数进行接收空格或者换行
ynl@ynl:~/C_code/inClass/6m4r$ cat demo0.c
//标准输入函数和标准输出函数
#include<stdio.h>
int main()
{
//定义变量
/*
int a;
int b;
int c;
*/
//一条语句定义三个变量
/* int a,b,c;
printf("a = %d\tb = %d\tc = %d\n",a,b,c);
//标准出入函数
scanf("%d%d%d",&a,&b,&c);
printf("a = %d\tb = %d\tc = %d\n",a,b,c);
*/
char a,b,c,tmp;
// scanf("%c%c%c",&a,&b,&c);
scanf("%c",&a);
getchar();
//scanf("%c",&tmp);
scanf("%c",&b);
getchar();
//scanf("%c",&tmp);
scanf("%c",&c);
getchar();
//scanf("%c",&tmp);
printf("a = %c-----%d\tb = %c-----%d\tc = %c-----%d\n",a,a,b,b,c,c);
return 0;
}
ynl@ynl:~/C_code/inClass/6m4r$ gcc demo0.c
ynl@ynl:~/C_code/inClass/6m4r$ ./a.out
A B C
a = A-----65 b = B-----66 c = C-----67
ynl@ynl:~/C_code/inClass/6m4r$
2.1各类数值型数据间的混合运算
整型、实型、字符型数据间可以进行混合运算,如:
10 - 'a' * 1.5
运算时,参加运算的两个数据如果类型不同,则首先将其类型转换成一致再运算,转换规则是:
将优先级低的类型转换到优先级高的类型
注意:在混合运算过程中,系统所进行的类型转换并不改变原数据的类型,只是在运算过程中将其值变成同类型后再运算。
注意:在混合运算过程中,系统所进行的类型转换并不改变原数据的类型,只是在运算过程中将其值变成同类型后再运算。
说明:
1、char和short类型参与运算,结果一定是int类型
char与char ----->int
short与short ----->int
char与short ----->int
2、float类型参与运算,结果一定时double类型
flaot类型和所有类型的运算的结果都是double(在旧版C标准是符合该情况)
3、低优先级与高优先级运算时,会转换成高优先级
char与int-->int
short与int--->int
int与unsigned int-->unsigned int
int与double-->double
long与long->long
long与unsigned long->unsigned long
//数据类型的优先级
#include<stdio.h>
int main()
{
char a = 10;
char b = 20;
printf("char + char 的运算结果的数据类型大小:%lu\n",sizeof(a + b));//4 结果的数据类型是int
short c = 10;
short d = 21;
printf("short + short 的运算结果的数据类型大小:%lu\n",sizeof(c + d));//4 结果的数据类型是int
printf("char * short 的运算结果的数据类型大小:%lu\n",sizeof(a * c));//4 结果的数据类型是int
float e = 3.141F;
printf("short + flaot 的运算结果的数据类型大小:%lu\n",sizeof(c + e))//4 结果的数据类型是float
float = 90; //隐式转换
return 0;
}
隐式转换:隐式数据类型转换(从低到高):系统会自动的将低优先级数据类型的数据转换成高优先级数据类型的数据
强制转换:强制数据类型转换(从高到低):强制,被迫的将高优先级数据类型的数据转换成低优先级数据类型的数据(需要使用特定的代码书写格式)
//强制转换
int a = (int)23.45; //23 ---强制类型转换有风险,会损失精度,不建议使用
char b = (char)sizeof(int) //sizeof计算变量或数据类型的所占空间大小,结果类型是unsigned long
//隐式转换
//算术转换:在算术运算中,低级别的类型将自动转换为高级别的类型。
int main() {
char a = 100;
int b = 200;
int result = a + b; // char类型自动转换为int类型
printf("%d\n", result);
return 0;
}
//赋值转换:在赋值操作中,右侧表达式的类型将转换为左侧变量的类型。
int main() {
char a = 'A'; // 字符常量转换为char类型
int b = a; // char类型转换为int类型
printf("%d\n", b);
return 0;
}
//函数调用:传递参数给函数时,实参的类型可能会转换为形参的类型
void printValue(int a) {
printf("%d\n", a);
}
int main() {
char c = 'C';
printValue(c); // char类型转换为int类型
return 0;
}
//无符号类型转换:当涉及无符号类型时,某些情况下整数会提升为无符号类型。
int main() {
unsigned int a = 10;
int b = -20;
if (a > b) { // int类型转换为unsigned int类型
printf("a is greater\n");
} else {
printf("b is greater\n");
}
return 0;
}
//浮点类型提升:在浮点数运算中,float类型的操作数会自动转换为double类型
int main() {
float a = 1.0f;
double b = 2.0;
double result = a + b; // float类型自动转换为double类型
printf("%f\n", result);
return 0;
}
2.2算术运算符和算术表达式
运算符:一些被C语言赋予特定功能的符号 例如:+ * = sizeof
表达式: 将(变量或常量)数据用运算符连接起来形成的式子 23 > 45 int a = 90;
一般以分号(;)结尾,C语言支持单独写一个常量语句或者变量语句
2.2.1语言运算符
1、C运算符
(1)算术运算符 + - * / % ; (2)关系运算符 V = == !=;
(3)逻辑运算符 !&& ||; (4)位运算符 << >> ~ ^ &;
(5)赋值运算符 = += -= *= /= %=;
(6)条件运算符(三目运算符) ?: ;
(7)逗号运算符 , ; (8)指针运算符 * & ;
(9)求字节数运算符 sizeof ; (10)下标运算符 [ ] ;
(11)强制类型转换运算符 (类型); (12)分量运算符 . -> ;
(13)其它 如函数调用运算符();
1.算数运算符: + - * / % ++ --
+ - * 和数学中的操作一样; 先算乘除后算加减
/(取商)
:两个整数相除,结果是取商 例如:5/2 ==>2
: 浮点数相除,和数学中的一样,得到的是浮点数
5/2.0 ==>2.5 5.0/2==>2.5 5.0/2.0==>2.5
%(取余/取模)
:两个整数相除,结果取余数 例如:5/2==>1
: 浮点数不能取余操作 例如:5.0 % 2 语法错误
++(自增/递增)
- -(自减/递减)
:++,--是单目运算符(一元运算符),操作的数据只能是一个变量,不能是常量;
例如++a, a++; 错误-->5++, ++5
: ++或--在单独使用时,放在变量左侧或放在变量的右侧效果一样,都是给变量的值加1(减1)后再赋值给变量
例如:
nt a = 2;
a++; //单独使用 与a = a + 1;的结果一样
++a; //单独使用 与a = a + 1;的结果一样
作为for循环语句的结构中
for(;; ++a); //单独使用
for(;; a++); //单独使用
printf("%d\n", a++); --- 不是单独使用
如果不是单独使用:
自增/自减在变量之前:先自增或自减,再参与其他运算
自增/自减在变量之后:先参数其他运算,后自增或自减
:浮点数也可以自增或自减,但只会操作整数部分 --- 很少对浮点数做自增或自减操作
例如:float a = 11.2;
a++; a==>12.2
单目运算符/一元运算符:该运算符只能运算一个数,这样的符号称为一元运算符
双目运算符/二元运算符:该运算符的左侧和右侧分别有数据,连接的是两个数据,所以称为二元运算符
三目运算符/三元运算符:表达式1?表达式2:表达式3; 只有一个三元运算符,该运算符连接的是三个数据
结论:
运算符的优先级:(从高到低)
一元运算符 > 二元运算符 > 三元运算符