算术双目操作(运算)符:+、-、*、/、%
+、-、*、/、%均为双目操作(运算)符,即:
1+4、a+b、num1+num2,都有两个操作数所以叫双目操作符
注:当除数与被除数都是整型时结果也为整型,若想要得到浮点型的结果,两个运算数必须至少有一个为浮点型并且使用%f
#include <stdio.h> int main(){ int a=5; printf("%d",a/2); return 0; } //结果为2,而不是2.5 #include <stdio.h> int main(){ int a=5; printf("%f",a/2.0); return 0; } //结果为2.500000%为取余运算符即返回两个整数相除的余值。只能用于整型之间的运算,无法在浮点型中使用
#include <stdio.h> int main(){ printf("%d\n", 5 % 2); //5除2余1 结果得1 printf("%d\n", 10 % 4);//10除4余2 结果得2 return 0; }赋值操作(运算)符 =
创建变量时给一个值称初始化,创建好后再给一个值称赋值
#include <stdid.h> int main(){ int num1 = 199 //初始化 num1 = 299 //赋值 return 0 }赋值操作符=可以随时给变量赋值
复合赋值符
对一个变量进行自增或自减
#include <stdio.h> int main(){ int sum = 3; int _sum1 = 3; int sub = 4; int _sub1 = 4; int mul = 5; int _mul1 = 5; int div = 6; int _div1 = 6; sum = sum+3; _sum1 += 3; sub = sub-4; _sub1 -= 4; mul = mul * 5; _mul1 *= 5; div = div / 6; _div1 /= 6; return 0; } 输出 6 6 0 0 25 25 1 1a = a+3也可以表示为a += 3,同理加减乘除都可以
(还有>>==、<<==、&=、|=、^=后面学到)
单目运算符++(自增)、--(自减)、+(正号)、-(负号)
自增自减:
使变量值加1或减1。
#include <stdio.h> int main(){ int sum = 3; int _sum1 = 3; int sub = 3; int _sub1 = 3; int j , f; j = sum++; //sum的值先赋给j,再进行自增 printf("%d\n",j); j = ++_sum1; //sum的值先自增,再进行赋给j printf("%d\n",j); f = sub--; //sub的值先赋给f,再进行自减 printf("%d\n",f); f=--_sub1; //sub的值先自减,再进行赋给f printf("%d\n",f); return 0; } 输出 3 4 3 2强制类型转换
#include <stdio.h> int main(){ int a; a = (int)3.14; //浮点型强制转换整型 printf("%d\n",a); float b; b = (float)2; //整型强制转换浮点型 printf("%f",b); return 0; } 输出: 3 2.000000强制类型转换不到万不得已不用使用。
输入输出(printf、scanf)
printf
printf()的作用是将参数文本输出到屏幕。它名字里面的f代表format
(格式化),表示可以定制输出文本的格式。
使用printf()函数时必须添加头文件<stdio.h>。
#include <stdio.h> int main(){ printf("hellow %s","world"); return 0; }在行尾自动添加换行符,运行结束后,光标就停留在输出结束的地方,不会自动换行。
为了让光标移到下一行的开头,可以在输出文本的结尾,添加一个换行符\n。
占位符
printf()可以在输出文本中指定占位符。
也就是这个位置可以用其他值代入。
printf("hellow %s","world"); 中的%s就是占位符,其中world可以改为任何字符串
%a:十六进制浮点数,字母输出为小写。
%A:十六进制浮点数,字母输出为大写。
%c:字符。//char
%d:十进制整数(有符号的10进制整数)。//int
%e:使用科学计数法的浮点数,指数部分的e为小写。
%E:使用科学计数法的浮点数,指数部分的E为大写。
%i:整数,基本等同于%d。
%f:小数(包含float类型和double类型)。//float %f double -%lf
%g:6个有效数字的浮点数。整数部分一旦超过6位,就会自动转为科学计数法,指数部分的e为小写。
%G:等同于%g,唯一的区别是指数部分的E为大写。
%hd:十进制 short int类型。
%ho:八进制 short int类型。
%hx:十六进制short int类型。
%hu:unsigned short int 类型.
%ld:十进制 long int 类型。
%1o:八进制long int类型。
%1x:十六进制long int类型。
%lu:unsigned long int 类型.
%11ld:十进制 long long int 类型。
%1lo:八进制long long int类型。
也可在同一条语句中使用多个占位符
#include <stdio.h> int main(){ printf("%s say : it'%d o'clock","zhang san",4); return 0; } //运行结果: //zhang san say : it'4 o'clockprintf()参数与占位符是一一对应关系,如果有n个占位符,printf()的参数就应该有n+1个。如果参数
个数少于对应的占位符,printf()可能会输出内存中的任意值。像这样
限定宽度
#include <stdio.h> int main(){ printf("%d\n",12345); printf("%5d\n",123); printf("%-5d\n",123); printf("%-4s","abc"); printf("%s","def"); return 0; } /*输出: 12345 123 123 abc def*/在例中%5d表示这个占位符至少有5位,如果不够5位,对应的值前面会添加空格。
可以发现当不够时输出内容是右对齐,在%后面插入-就变成了左对齐也就是“%-5d”
小数限定宽度
#include <stdio.h> int main(){ printf("%10f",1.5); return 0; } /*输出: 1.500000 */%f在打印小数时默认小数点后打印六位,加上小数点和整数部分为八位,设定为10位所以输出结果开头空两位。
小数限定位数
如果希望小数点后只保留一位,占位符可以写成%.1f,也可以与其他功能复合使用。
#include <stdio.h> int main(){ printf("%f\n",1.5); printf("%+.1f\n",1.5); printf("%+.1f\n",-1.5); printf("%+8.2f\n",3.1415); return 0; } /* 1.500000 +1.5 -1.5 +3.14 */用*替代
最小宽度和最小位数这两个限定值都可以用*替代。
#include <stdio.h> int main(){ printf("%+*.*f\n",10,4,3.1415); return 0; } /*输出 +3.1415 */%+*.*f中的两个*通过printf中的参数10、4传入,解读为:限定宽度10、限定位数4打印带正负号的浮点型3.1415。
输出部分字符串
%s为默认全部输出字符串,可以用%.[m]s指定输出长度(m为数字,表所输出的长度)
#include <stdio.h> int main(){ printf("%.5s", "helloworld"); return 0; } /*输出 hello */总是显示正负号
默认情况下printf()不显示+号(正),只显示-号(负)。改为总是显示可在占位符%后加上+
#include <stdio.h> int main(){ printf("%f\n",1.5); printf("%+f\n",1.5); printf("%+f\n",-1.5); printf("%d\n",1); printf("%+d\n",1); printf("%+d\n",-1); return 0; } /*输出: 1.500000 +1.500000 -1.500000 1 +1 -1 */scanf
写法
#include <stdio.h> int main(){ int i; printf("输入:"); scanf("%d",&i); printf("是:%d",i); return 0; }如果我们的代码中使用了scanf s,那么你的代码在其他的编译器上是编译不通过的,也就失去了跨平台
一次输入多个类型
#include <stdio.h> int main(){ int i=0; int j=0; float x = 0; float y = 0; scanf("%d%d%f%f",&i, &j, &x, &y); printf("i = %d\n",i); printf("j = %d\n", j); printf("x=%f\n",x); printf("y = %f\n", y); return 0; } /* 输入: 1 2 3 4 输出: i = 1 j = 2 x=3.000000 y = 4.000000 */scanf在处理占位符时会自动过滤空白字符,包括空格、制表符、换行符等
所以在用户输入的数据之间,有一个或多个空格等上面提到的不影响解读。
scanf原理
scanf ()处理用户输入的原理是,用户的输入先放入缓存中,等到按下回车键后按照占位符对缓存进行解读。解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符为止。
scanf返回值
scanf返回的值是成功读取变量的个数,如果没有读取到任何变量或匹配失效则返回0
如果在成功读取任何数据之前发生了读取错误或者读取到文件结尾,则返回常量EOF(-1)
#include <stdio.h> int main(){ int a,b; float f ; int r = scanf("%d %d %f",&a , &b , &f); printf("a = %d , b = %d , f = %f\n",a,b,f); printf("r = %d\n",r); return 0; } /*输入2、3、5后scanf返回值为3*/ /*输入1、去、2后scanf返回值为1,因为在读取第二个变量时就已经失败*/ /*输入ctrl+z快捷键后scanf返回值为-1*/由此可写一个循环加法计算器当按下ctrl+z时退出程序
#include <stdio.h> int main(){ int a=0,b=0; //初始化 while (scanf("%d,%d",&a,&b) !=EOF ) //循环当scanf返回值不等于-1时退出 { int c =a + b; printf("%d",c); } //ctrl+z后返回值为-1 不等于2退出 //读取时第一个或第二个数字不属于整型,退出 return 0; }scanf的占位符
| scanf | printf |
|---|---|
float %f double %lf long double %Lf | float %f double %lf、%f long double %Lf |
可以看到scanf与printf的占位符基本一致,double类型时有明显区别。
%c:字符
//上面所有占位符之中,除了%c以外,都会自动忽略起首的空白字符。%c不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格
%d:整型
%f :float浮点型
%lf :double浮点型
%Lf:long double 浮点型
%s:字符串
%[ ]:在方括号中指定一组匹配的字符(如%[0-9]),遇到不在集合中的字符时,匹配将会停止
%[ ]是scanf的字符集匹配占位符,用于读取指定字符集中的字符,并不能用int、float、double之类的占位符。
基本用法:%[characters] -方括号内列出允许读取的字符 -只会读取给定的字符,遇到不在集合中的字符时停止。
char strl[100];// 读取只包含字母的字符串 scanf("%[a-zA-Z]",str1); // 只接受a-z和A-Z char str2[100];//读取数字字符串 scanf("%[e-9]", str2);// 只接受数字 scanf("%[a-zA-Z0-9]", str2);//读取字母和数字 否定形式 使用^否定,排除某些字符://读取除换行符外的所有字符 scanf("%[^\n]", str);//读取整行(不含换行符) 常见用法 scanf("%s", str);// 读取到第一个空格为止的单词例如(下面的代码中str1并没有使用&是因为str1是数组,数组本来就是地址所以不需要再用&取地址)
#include <stdio.h> int main(){ char str1[100]; scanf("%[a-zA-Z]",str1); //只接受a-z和A-Z printf("%s",str1); return 0; } 输入: qwer1234qwer 输出: qwer /**************************************************/ #include <stdio.h> int main(){ char str1[100]; scanf("%[0-9]",str1); //只接受0-9的字符,并不是int整型 printf("%s",str1); return 0; } 输入: 1234twer 输出: 1234注:在上面所有占位符之中,除了%以外,都会自动忽略起首的空白字符。%c不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格。如要强制跳过字符前的空白字符,可以写成scanf(" %c",&ch);在%c前面加上一个空格,表示跳过零个或多个空白字符。
而%s,它不能简单地等于字符串。它的规则是从当前第一个非空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止。因为%s不会包含空白字符,所以无法用来读取多个单词,除非多个%s一起使用。这也意味着,scanf()不适合读取可能包含空格的字符串,比如书名或歌曲名。另外,scanf()遇到%s占位符,会在字符串变量末尾存储一个空字符\0。
#include <stdio.h> int main(){ char str1[100]; scanf("%[0-9]",str1); //只接受0-9的字符,并不是int整型 printf("%s",str1); return 0; } 输入 12 34 输出 12当使用scanf将字符串读入数组时,scanf不会检测字符串是否超过了数组长度,为了防止这种情况,使用%s占位符时应指定读入字符的最长长度,写作:%[m]s,[m]代表读取字符串的最大长度,后面的字符将不读取
#include <stdio.h> int main(){ char arr[6]; scanf("%s",arr); printf("%s",arr); return 0; } #include <stdio.h> int main(){ char arr[6]; scanf("%6s",arr); printf("%s",arr); return 0; }数组长度只有6时我输入了很多字符,虽然可以打印但是编译器已经报错。
使用下半部分代码时可以正常打印且不会报错。
赋值忽略符
有时用户输入的格式可能不符合预定代码
#include <stdio.h> int main(){ int year = 0,month = 0,day = 0; scanf("%d-%d-%d",&year,&month,&day); printf("%d %d %d",year,month,day); }使用不同格式进行输入后
只要在任何占位符的后面加上*,该占位符就不会返回值,解析后将被丢弃。
#include <stdio.h> int main(){ int year = 0,month = 0,day = 0; scanf("%d %*c %d %*c %d",&year,&month,&day); printf("%d %d %d",year,month,day); }