C语言程序设计第三、四天/操作符\输入输出\强制类型转换

📅 2026/7/18 13:41:26 👁️ 阅读次数 📝 编程学习
C语言程序设计第三、四天/操作符\输入输出\强制类型转换

算术双目操作(运算)符:+、-、*、/、%

+、-、*、/、%均为双目操作(运算)符,即:

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 1

a = 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'clock

printf()参数与占位符是一一对应关系,如果有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的占位符

scanfprintf

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); }