椋鸟C语言笔记#3:操作符、输入与输出

萌新的学习笔记,写错了恳请斧正。


目录

算术操作符:+ - * / %

赋值操作符:= 与复合赋值符

复合赋值

单目操作符:++、--、+(正)、-(负)

强制类型转换

printf和scanf

printf

printf格式化符号(占位符)

scanf

scanf的返回值

scanf格式化符号(占位符)

赋值忽略符


算术操作符:+ - * / %

这些操作符左右两边都要有操作数,所以它们属于双目操作符

+加法:

  • 就正常加法

-减法:

  • 就正常减法

*乘法:

  • 就正常乘法

/除法:

  • 如果两端都是整型,那么执行整数除法,余数约去。如5/2的结果为2
  • 如果两端有哪怕一个小数(浮点),那么结果就正常算,输出浮点数

%取模:

  • 两边只能是整型,输出除法的余数。如5%2的结果为1
  • 结果的正负号由前一个数决定。如-9%-5的结果为-4

赋值操作符:= 与复合赋值符

在创建变量是给变量一个值叫初始化

之后给变量值就叫赋值

int a = 0;   //初始化
a = 1;   //赋值

也可以连续赋值,按照从右向左的顺序,但不建议这么写

a = b = c + 1
复合赋值

有的时候会对变量进行自增自减:

a = 0;
a = a + 2;
a = a + 3;

那么其实可以写成这样:

a = 0;
a += 2;
a += 3;

类似的,有:+=、-=、*=、/=、%=、<<=、>>=、&=、|=、^=(后面几个后面再说)

单目操作符:++、--、+(正)、-(负)

单目操作符就是只有一个操作数的操作符

++和--是一种自增的操作符,分为前置和后置两种

++就是自己加一的意思,--就是自己减一

++/--放在变量前面就是先自增/减,再参与该行代码的运算

++/--放在变量后面就是先参与该行代码的运算,再自增/减

int a = 1;
int b = ++a;
//这时a=2,b=2
a = 1;
b = a++;
//这时a=2,b=1

强制类型转换

可以用(datatype)来强制转换类型,比如:

int a = (int)114.514;
//这里114.514是double型,被强制转换为整型
//这导致其失去小数点后面内容,被当成114

printf和scanf

printf

printf就是用来把字符打印到屏幕上的

print是打印,f是format(格式)

所以要用格式化符号来指定输出格式,这些符号应包括在格式控制字符串

(除非只要打印字符串)

printf("%d阿巴阿巴%f歪比巴卜%lf",1,1.4,5.14);

括号里第一部分叫格式控制字符串

后面是输出字符参数表,与前面的字符串中的格式化符号按顺序对应填充

printf在输出完之后不会换到下一行,想换行需要自行添加\n

printf格式化符号(占位符)

下面列举占位符:

  • %a:十六进制浮点数,字母小写
  • %A:十六进制浮点数,字母大写
  • %c:字符
  • %d:十进制整数
  • %e:科学计数法,e小写
  • %E:科学计数法,E大写
  • %i:整数,老写法。用于scanf会将0打头的数字当8进制、0x打头的当16进制,会转换为10进制。
  • %f:小数/浮点,包括float和double
  • %g:6个有效数字的浮点数,整数部分超过六个或小于0.0001会自动转换成科学计数法,e小写
  • %G:同上,但E大写
  • %hd:10进制short
  • %ho:8进制short
  • %hx:16进制shout
  • %hu:unsigned short
  • %ld:10进制long
  • %lo:8进制long
  • %lx:16进制long
  • %lu:unsigned long
  • %lld:10进制long long
  • %llo:8进制long long
  • %llx:16进制long long
  • %llu:unsigned long long
  • %Le:科学计数法的long double
  • %Lf:long double
  • %n:已输出的字符串数量。这个占位符本身不输出,只把值存在特定变量中
  • %o:8进制整数
  • %p:指针
  • %s:字符串
  • %u:unsigned
  • %x:16进制整数
  • %zd:size_t
  • %%:输出正常的百分号

注意:

  • 上述以o、x结尾的均为无符号数
  • 以x结尾的十六进制中字母小写,若以X结尾则大写

占位符可以添加限定:

  • 占位符的%后面加数字可以限定占位符输出的最小宽度
  • 如%[n].[m]d、%[n].[m]s、%[n].[m]f、%[n].[m]g、%[n].[m]G
  • 其中n、m用数字替换,n限定了输出的最小总宽度、m限定精度
 #include 
 int main()
 {
    printf("%5.2d\n", 123); // 输出为"   12" 
    return 0;
 }

        少于最小宽度的会补空格来达到要求,多于最小宽度的正常输出

        默认右对齐,即左边加空格。在“%”和数字间加“-”可以改为左对齐

***    如果写成类似"%05d"的形式,就不会补空格而是补0

  • 对于整型%d,n限制的是实际输出的整数位数(从左往右截取),如果数字位数小于n就左边填充0(这与m限制时填充空格不同)
  • 对于浮点数%f,如“%7.3f”:

        此时小数点前面的数7表示浮点数最小总位数为7

        而小数点后面的3表示浮点数小数部分强制保留为3位

        小数点前面可以没有数字,如:“%.4f”,只有小数强制4位的限定

        可以只有小数点前面:“%5f”,这种依旧适用,限制最小宽度

  • 对于字符串%s,n限制的是实际输出的字符个数(从左往右截取)
  • 对于%g(%G),n限制的是有效数字位数,但会删除末尾的0
  • 占位符“%”后面加“+”可以让输出强制带有正负号
  • 对于字符串也可以用“%[n].[m]s”来限制长度,[n][m]替换为数字,n为

        比如“%.5s”就是截取字符串前5位输出

注意!!!小数点也算一位!!!指数里的e(E)也算一位!!!

scanf

scanf函数用于从外界(键盘)获得数据

程序运行到scanf函数就会停下来等待输入

输入完按回车后scanf开始处理输入的数据

用法和printf类似:

int a,b,c;
scanf("%d %d %d",&a,&b,&c);

scanf第一个参数和printf一样,也是格式控制字符串

里面会有占位符,用以规定scanf如何读取输入的数据

(C语言的数据都有类型,所以scanf要提前知道类型才能处理数据)

scanf会自动过滤输入中的空白字符,包括空格、制表符、换行符等

所以输入的数据之间可以有一至多个空格甚至换行

(在最后一个数据也被填入后再回车就会结束输入继续运行)

“%c”字符类型除外!!!!!空格会被读入!!!!!

为什么会有这些特性呢?

让我们追本溯源看看原理:

用户的输入会被放入缓存,按下回车后开始解读

解读时会从上一次解读遗留的第一个字符开始,直到读完缓存或遇到第一个不符合条件的字符

所以在遇到空格时就结束了这个数据的读取(空格是字符所以会被字符类型读取)

而scanf后面的几个参数,如果不是字符串/数组等类型(自带指针)

就必须在变量名前加一个&,代表读取其对应的内存地址

scanf的返回值

scanf函数也是有返回值的,返回值就是顺次成功读取的变量个数

(即到第一个错误读取为止之前正确读了几个)

如果输入不匹配,没有读取到任何值,返回0

如果直接碰到缓存结尾,返回EOF(其值等于-1)

返回EOF可以通过按Ctrl+Z来实现

scanf格式化符号(占位符)

基本与printf一致,但有个特殊的:

  • %[ ]:在方括号内指定一组匹配字符,遇到不在其中的就结束(比方说"%[0-9]")
  • %后用数字限制只能限制最大宽度为n,不能用m限制

另外还有几个相关要点:

  • 对于“%c”我们知道它不会忽略起始的空格,但如果写成如下形式可强制跳过起始的一个或多个空格
scanf(" %c", &ch);   //前面加个空格
  • 对于“%s”其代表的不仅仅是一个字符串了,它将从当前第一个非空白字符读起,直到再次遇到空白字符。因此“%s”不适合读取带有任何空格的字符串。
  • 另外scanf在读取“%s”时,会在结尾补上\0
  • 为了避免scanf读取“%s”时读太多字符进来溢出字符串类型的最大长度,可以用“%[m]s”来限定字符串最大长度。这样可以避免长度溢出。
赋值忽略符
 #include 
 int main()
 {
     int year = 0;
     int month = 0;
     int day = 0;
     scanf("%d-%d-%d", &year, &month, &day);
     printf("%d %d %d\n", year, month, day);
     return 0;
 }

在这里,如果输入2023-10-17,就能正常读入

但是如果输入2023/10/17就不能正常读入

可以使用赋值忽略符:

在占位符“%”后加个“*”,比方说:“%*c”

这样,改占位符会正常读取,但不会返回任何值

所以上方代码可以改成这样:

 #include 
 int main()
 {
     int year = 0;
     int month = 0;
     int day = 0;
     scanf("%d%*c%d%*c%d", &year, &month, &day);
     return 0;
 }

这样,无论输入2023-10-17还是2023/10/17都行了


你可能感兴趣的:(C语言笔记,笔记,c语言,开发语言)