C语言学习分享
1、常用的数据输入/输出
1.1、输入/输出设备
- C 语言中的标准库提供了输入和输出函数
- 标准库提供:输入/输出函数来处理输入、输出、字符和字符串等操作
- 标准输入设备通常是指键盘
- 标准输出设备通常是指显示器(也称控制台)
- 可以用文件代替标准输入和输出设备
1.1.1、控制台
- 默认整个控制台屏幕共有80列(或40列)25行的文本单元, 每个单元包括一个字符和一个属性, 字符即ASCII 码字符
控制台的注意事项:
当输出超出屏幕的右边界时会自动转到下一行的开始处继续输出;
当屏幕内填满内容仍没有结束输出时, 屏幕将会自动逐行上卷直到输出结束为止
1.1.2、stdio头文件
- #include <stdio.h>
- 这是一个预处理命令
- stdio.h 是一个文件,称为头文件
- 包括对应于 C 语言程序中使用的输入/输出函数的宏
- 所设计的 printf()、scanf()、putchar()、getchar() 等函数需要使用头文件中的这些宏才能正确执行
1.2、输入/输出语句
1.2.1、字符数据输入/输出
- 控制台输入/输出函数将其操作指向系统的标准输入(键盘)和标准输出(显示器)
- C语言中最简单的控制台输入/输出是:
- getchar() – 从键盘读取一个(且仅一个)字符
- putchar() – 在屏幕上输出一个字符
1.2.1.1、getchar函数
- 函数原型:int getchar(void);//没有参数
- 函数功能:从终端输入一个字符。
- 返回值:返回输入字符的ASCII码,可以使用字符变量或者整型变量接收。
- 其它说明:
- getchar()函数没有参数,但仍然必须使用括号
- 缓冲字符,直到用户按回车键。虽然可以输入多个字符,但函数只接受第一个字符。
#include <stdio.h>
int main()
{
char cChar1; //声明变量
cChar1=getchar(); //在输入设备得到字符
putchar(cChar1); //输出字符变量
putchar('\n'); //输出转义字符
return 0;
}
1.2.1.2、putchar函数
- 函数原型:int putchar(int c);
- 函数功能:从终端输出一个字符, 且转换成ASCII码返回。
- 函数参数:其中c要输出的字符,可以是字符型常量、字符型变量、整型常量、整型变量表达式、转义序列等。
- putchar() 的选项和效果,如下表:
#include <stdio.h>
int main()
{
char cChar1,cChar2,cChar3,cChar4; //声明变量
cChar1='H'; //为变量赋值
cChar2='e';
cChar3='l';
cChar4='o';
putchar(cChar1); //输出字符变量
putchar(cChar2);
putchar(cChar3);
putchar(cChar3);
putchar(cChar4);
putchar('\n'); //输出转义字符
return 0;
}
1.2.2、字符串输入/输出
1.2.2.1、gets函数
- 函数原型:char*gets(char *str);
- 函数功能:将读取的字符串保存在形式参数str变量中,读取过程直到出现新的一行为为止。
- 函数参数:str函数指针变量为形式参数。
#include<stdio.h>
int main()
{
//说明:因为要接收输入的字符串,所以要定义一个可以接收字符串的变量。
//在程序代码中,定义cString为字符数组变量的标识符
char cString[30]; //定义一个字符数组变量
gets(cString); //获取字符串
puts(cString); //输出字符串
return 0;
}
1.2.2.2、puts函数
- 函数原型:int put(char* str);
- 函数功能:输出一个字符串到屏幕上。
- 函数参数:形式参数str是字符指针类型,可以用来接收要输出的字符串。
#include<stdio.h>
int main()
{
//在下面的语句中,加上“\0”字符后,puts函数输出的字符串就变成了“I”.
char *Char ="ILOVECHINA"; //定义字符串指针变量
puts("ILOVECHINA"); //输出字符串常量
puts("I\0LOVE\0CHINA"); //输出字符串常量,其中介入结束符“\0”
puts(Char); //输出字符串变量的值
Char="I\0LOVE\0CHINA"; //改变字符串变量的值
puts(Char); //输出字符串变量的值
return 0;
}
说明:编译器会在字符串常量的末尾添加结束符“\0”,这也就说明了puts函数会在输出字符串常量时最后进行换行操作的原因。
1.2.3、格式输入/输出
1.2.3.1、scanf函数
- 函数功能:用于接收数据
- 函数返回值:输入成功的参数数量,否则返回0
- 函数原型:
#include <stdio.h>
int main() {
int a;
float d;
char ch, name[40];
printf("Please enter the data\n ");
scanf(“a=%d%f%c %s”, &a, &d, &ch, name);//空格、回车、Tab
printf("\n%d, %f, %c, %s", a, d, ch, name);
return 0;
}
1.2.3.2、printf函数
- 函数功能:用于在标准输出设备控制台上显示数据
- 函数返回值:输出的字符数量,如果错误返回EOF
- 函数原型:
#include <stdio.h>
#include <math.h>
int main(){
int iNum = 10;
float fNum = 24.6789;
char ch = ‘A’;
printf("iNum = %d\n", iNum);
printf("fNum = %f\n",fNum );
printf("ch = %c\n",ch);
printf("hello\n");
printf("%s","hello\n");
printf(“%%”); //输入百分号
printf(“%c\n”,‘%’);//
return 0;
}
1.2.4、输出格式
1.2.5、转义字符
1.3、输入/输出缓冲区
- 缓冲区(流)负责在输入/输出设备和程序之间建立联系。
- 输入设备->内存缓冲区(stdin)->程序
- 程序->内存缓冲区(stdout)->输出设备 - 是一块临时的存储区域,或在内存中,或在设备的控制卡上
2、运算符与表达式
2.1、运算符
- 根据操作数的数量可以分为:一元运算符、二元运算符和三元运算符
- 根据用途可以分为以下几类:
- 赋值运算符
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符…… - 运算符的优先级和结合方向
- 按运算符的优先级高低次序执行。例如,先乘除后加减。
- 如果在一个运算对象(或称操作数)两侧的运算符的优先级相同,则按C语言规定的结合方向(结合性)进行。
2.1.1、算术运算符
- 算术表达式中的运算符都是算术运算符。
- 示例:
- (x+y)/2-1
- ++i % 7
- (i++)+(i++)和(++i)+(++i)
C语言规定:两个整数相除,其商为整数,小数部分被舍弃。例如,22/5结果等于4,而不是4.4。
2.1.2、赋值运算符
- 赋值符号“=”就是赋值运算符,它的作用是将一个表达式的值赋给一个变量。
- 通用的形式:变量名=表达式
- 将同一个值赋给多个变量的操作叫做多重赋值 a=b=c=10
2.1.3、复合赋值运算符
还可以与位运算符构成复合赋值运算符,如:^=、<<=、>>=、&=、|=
2.1.4、位运算符
2.1.5、运算符结核性
所谓结合性是指,当一个操作数两侧的运算符具有相同的优先级时,该操作数是先与左边的运算符结合,还是先与右边的运算符结合。
自从左向右的结合方向,称为左结合性。反之,称为右结合性。
2.2、表达式
用运算符和括号将操作数连接起来的、符合C语言语法规则的式子,称为表达式
- 运算符和操作数的有效组合
- 操作数可以是变量、常量或者函数
- 在程序执行的过程中,变量的实际值和表达式中出现的常量一起使用
- 表达式可分为:
- 算术表达式
- 关系表达式
- 逻辑表达式
- 函数表达式
2.2.1、赋值表达式
- 所有的赋值运算符的优先级相同
- 始终按从右向左顺序进行计算(a=b=c=5)
- 赋值运算符的优先级低于算术运算符,仅高于逗号运算
- 赋值表达式
- 由赋值运算符或复合赋值运算符,将一个变量和一个表达式连接起来的表达式,称为赋值表达式。
- 赋值表达式的值:任何一个表达式都有一个值,赋值表达式也不例外。被赋值变量的值,就是赋值表达式的值。
2.2.2、关系表达式
用于测试两个操作数或两个表达式之间的关系,其中操作数可以是变量、常量和表达式
- 关系表达式的计算结果 = 逻辑值(真-非0或假-0)
注意:
-
if(a==1) 不要写成if(a=1) ! ! ! 最好写成if(i ==a)
因为如果写成if(1=a),编译器会报错 -
不能写成if(1<a<5) 要写成 if(a>1 && a<5)
2.2.3、逻辑表达式
- 逻辑运算符用于对包含关系运算符的表达式进行合并或取非
- 使用逻辑运算符的表达式,返回 0 表示假,返回 1 表示真
逻辑表达式计算有时会出现部分表达式不参加运算的情况(短路现象)
例子:int a=1,b=2; if(a<5 || (b=10)) printf(“b=%d\n”,b); 观察b的值
2.2.4、优先级
- 优先级建立了计算算术表达式时,一组运算符相对于另一组的层次关系
- 优先级指 C 语言计算运算符的顺序
- 可通过将表达式括在括号中来改变运算符的优先级
- 优先级别相同,运算次序由结合方向决定
- 运算符的结合方式有两种:左结合和右结合
- 不同的运算符要求有不同的运算对象个数
- 当一个表达式中的运算符具有相同优先级时,结合性还指出C语言计算这些运算符的顺序
2.3、类型转换
运算符的操作数属于不同的数据类型,运算时通常会将这些操作数转换为同一类型,由编译系统自动完成。
- 在赋值表达式中,自动将赋值运算符右边表达式的值的类型转换成左边变量的类型
- 级别高低
char->short->int(long)->unsigned int->float->double(long double)
2.4、type强制类型转换
通过使用转换可以将一个表达式强制转换成某一种类型,是一元运算符。
- 转换的通用语法是:
- (type) cast
- type 任意有效的 C 数据类型
- 示例: