C语言学习第五弹

长度
格式 : printf("a = %[ 长度 ] 类型 ", a) ;
转义字符
格式 : printf("%f%%", 3.1415) ;
% 号在格式控制字符串中有特殊含义 , 所以想输出 % 必须添加一个转移字符
Scanf 函数
scanf 函数用于接收键盘输入的内容 , 是一个阻塞式函数 , 程序会停在 scanf 函数出现的地方 , 直到接收
到数据才会执行后面的代码
printf 函数的调用格式为 :
#include <stdio.h>
int main (){
// 1234.567871093750000
float a = 1234.567890123456789 ;
// 1234.567890123456900
double b = 1234.567890123456789 ;
printf ( "a = %.15f\n" , a ); // 8 位数字是准确的 , 后面的都不准确
printf ( "b = %.15f\n" , b ); // 16 位数字是准确的 , 后面的都不准确
}
#include <stdio.h>
int main (){
char a = 'a' ;
short int b = 123 ;
int c = 123 ;
long int d = 123 ;
long long int e = 123 ;
printf ( "a = %hhd\n" , a ); // 97
printf ( "b = %hd\n" , b ); // 123
printf ( "c = %d\n" , c ); // 123
printf ( "d = %ld\n" , d ); // 123
printf ( "e = %lld\n" , e ); // 123
}
#include <stdio.h>
int main (){
printf ( "%f%%" , 3.1415 ); // 输出结果 3.1415%
}
代码情缘 scanf(" 格式控制字符串 ", 地址列表 ) ;
例如 : scanf("%d", &num) ;
基本用法
地址列表项中只能传入变量地址 , 变量地址可以通过 & 符号 + 变量名称的形式获取
接收非字符和字符串类型时 , 空格、 Tab 和回车会被忽略
非格式字符串原样输入 , 格式控制字符串会赋值给地址项列表项中的变量
不推荐这种写法
接收多条数据
格式控制字符串和地址列表项在数量和类型上必须一一对应
#include <stdio.h>
int main (){
int number ;
scanf ( "%d" , & number ); // 接收一个整数
printf ( "number = %d\n" , number );
}
#include <stdio.h>
int main (){
float num ;
// 例如 : 输入 Tab 空格 回车 回车 Tab 空格 3.14 , 得到的结果还是 3.14
scanf ( "%f" , & num );
printf ( "num = %f\n" , num );
}
#include <stdio.h>
int main (){
int number ;
// 用户必须输入 number = 数字 , 否则会得到一个意外的值
scanf ( "number = %d" , & number );
printf ( "number = %d\n" , number );
}
代码情缘 非字符和字符串情况下如果没有指定多条数据的分隔符 , 可以使用空格或者回车作为分隔符 ( 不推荐
这种写法 )
非字符和字符串情况下建议明确指定多条数据之间分隔符
\n scanf 函数的结束符号 , 所以格式化字符串中不能出现 \n
scanf 运行原理
系统会将用户输入的内容先放入输入缓冲区
scanf 方式会从输入缓冲区中逐个取出内容赋值给变量
如果输入缓冲区的内容不为空 ,scanf 会一直从缓冲区中获取 , 而不要求再次输入
#include <stdio.h>
int main (){
int number ;
scanf ( "%d" , & number );
printf ( "number = %d\n" , number );
int value ;
scanf ( "%d" , & value );
printf ( "value = %d\n" , value );
}
#include <stdio.h>
int main (){
int number ;
int value ;
// 可以输入 数字 空格 数字 , 或者 数字 回车 数字
scanf ( "%d%d" , & number , & value );
printf ( "number = %d\n" , number );
printf ( "value = %d\n" , value );
}
#include <stdio.h>
int main (){
int number ;
int value ;
// 输入 数字 , 数字 即可
scanf ( "%d,%d" , & number , & value );
printf ( "number = %d\n" , number );
printf ( "value = %d\n" , value );
}
#include <stdio.h>
int main (){
int number ;
// 输入完毕之后按下回车无法结束输入
scanf ( "%d\n" , & number );
printf ( "number = %d\n" , number );
}
代码情缘 利用 fflush 方法清空缓冲区 ( 不是所有平台都能使用 )
格式 : fflush(stdin) ;
C C++ 的标准里从来没有定义过 fflush(stdin)
MSDN 文档里清除的描述着 "fflush on input stream is an extension to the C standard"
fflush 是在标准上扩充的函数 , 不是标准函数 , 所以不是所有平台都支持)
利用 setbuf 方法清空缓冲区 ( 所有平台有效 )
格式 : setbuf(stdin, NULL) ;
#include <stdio.h>
int main (){
int num1 ;
int num2 ;
char ch1 ;
scanf ( "%d%c%d" , & num1 , & ch1 , & num2 );
printf ( "num1 = %d, ch1 = %c, num2 = %d\n" , num1 , ch1 , num2 );
char ch2 ;
int num3 ;
scanf ( "%c%d" , & ch2 , & num3 );
printf ( "ch2 = %c, num3 = %d\n" , ch2 , num3 );
}
#include <stdio.h>
int main (){
int num1 ;
int num2 ;
char ch1 ;
scanf ( "%d%c%d" , & num1 , & ch1 , & num2 );
printf ( "num1 = %d, ch1 = %c, num2 = %d\n" , num1 , ch1 , num2 );
//fflush(stdin); // 清空输入缓存区
代码情缘 putchar getchar
putchar: 向屏幕输出一个字符
getchar: 从键盘获得一个字符
运算符基本概念
和数学中的运算符一样 , C 语言中的运算符是告诉程序执行特定算术或逻辑操作的符号
例如告诉程序 , 某两个数相加 , 相减 , 相乘等
什么是表达式
表达式就是利用运算符链接在一起的有意义 , 有结果的语句 ;
例如 : a + b; 就是一个算数表达式 , 它的意义是将两个数相加 , 两个数相加的结果就是表达式的
结果
注意 : 表达式一定要有结果
运算符分类
按照功能划分 :
算术运算符
setbuf ( stdin , NULL ); // 清空输入缓存区
char ch2 ;
int num3 ;
scanf ( "%c%d" , & ch2 , & num3 );
printf ( "ch2 = %c, num3 = %d\n" , ch2 , num3 );
}
#include <stdio.h>
int main (){
char ch = 'a' ;
putchar ( ch ); // 输出 a
}
#include <stdio.h>
int main (){
char ch ;
ch = getchar (); // 获取一个字符
printf ( "ch = %c\n" , ch );
}
代码情缘 赋值运算符
关系运算符
逻辑运算符
位运算符
按照参与运算的操作数个数划分 :
单目运算
只有一个操作数 如 : i++;
双目运算
有两个操作数 如 : a + b;
三目运算
C 语言中唯一的一个 , 也称为问号表达式 如 : a>b ? 1 : 0;
运算符的优先级和结合性
早在小学的数学课本中 , 我们就学习过 " 从左往右 , 先乘除后加减 , 有括号的先算括号里面的 ", 这句话就
蕴含了优先级和结合性的问题
C 语言中 , 运算符的运算优先级共分为 15 级。 1 级最高 ,15 级最低
C 语言表达式中 , 不同优先级的运算符 , 运算次序按照由高到低执行
C 语言表达式中 , 相同优先级的运算符 , 运算次序按照结合性规定的方向执行
代码情缘 优先级
名称
符号
说明
3
乘法运算符
*
双目运算符 , 具有左结合性
3
除法运算符
/
双目运算符 , 具有左结合性
3
求余运算符 ( 模运算符 )
%
双目运算符 , 具有左结合性
4
加法运算符
+
双目运算符 , 具有左结合性
4
减法运算符
-
双目运算符 , 具有左结合性
算数运算符
注意事项
如果参与运算的两个操作数皆为整数 , 那么结果也为整数
如果参与运算的两个操作数其中一个是浮点数 , 那么结果一定是浮点数
求余运算符 , 本质上就是数学的商和余 " 中的余数
求余运算符 , 参与运算的两个操作数必须都是整数 , 不能包含浮点数
求余运算符 , 被除数小于除数 , 那么结果就是被除数
求余运算符 , 运算结果的正负性取决于被除数 , 跟除数无关 , 被除数是正数结果就是正数 , 被除数
是负数结果就是负数
代码情缘 求余运算符 , 被除数为 0, 结果为 0
求余运算符 , 除数为 0, 没有意义 ( 不要这样写 )
#include <stdio.h>
int main (){
int a = 10 ;
int b = 5 ;
// 加法
int result = a + b ;
printf ( "%i\n" , result ); // 15
// 减法
result = a - b ;
printf ( "%i\n" , result ); // 5
// 乘法
result = a * b ;
printf ( "%i\n" , result ); // 50
// 除法
result = a / b ;
printf ( "%i\n" , result ); // 2
// 算术运算符的结合性和优先级
// 结合性 : 左结合性 , 从左至右
int c = 50 ;
result = a + b + c ; // 15 + c; 65;
printf ( "%i\n" , result );
// 优先级 : * / % 大于 + -
result = a + b * c ; // a + 250; 260;
printf ( "%i\n" , result );
}
#include <stdio.h>
int main (){
// 整数除以整数 , 结果还是整数
printf ( "%i\n" , 10 / 3 ); // 3
// 参与运算的任何一个数是小数 , 结果就是小数
printf ( "%f\n" , 10 / 3.0 ); // 3.333333
}
#include <stdio.h>
int main (){
// 10 / 3 商等于 3, 1
int result = 10 % 3 ;
printf ( "%i\n" , result ); // 1
// 左边小于右边 , 那么结果就是左边
result = 2 % 10 ;
printf ( "%i\n" , result ); // 2
// 被除数是正数结果就是正数 , 被除数是负数结果就是负数
result = 10 % 3 ;
printf ( "%i\n" , result ); // 1
result = - 10 % 3 ;
printf ( "%i\n" , result ); // -1
result = 10 % - 3 ;
代码情缘 优先级
名称
符号
说明
14
赋值运算符
=
双目运算符 , 具有右结合性
14
除后赋值运算符
/=
双目运算符 , 具有右结合性
14
乘后赋值运算符 ( 模运算符 )
*=
双目运算符 , 具有右结合性
14
取模后赋值运算符
%=
双目运算符 , 具有右结合性
14
加后赋值运算符
+=
双目运算符 , 具有右结合性
14
减后赋值运算符
-=
双目运算符 , 具有右结合性
赋值运算符
简单赋值运算符
复合赋值运算符
printf ( "%i\n" , result ); // 1
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值