3.1算术运算符
运算符 | 运算 | 范例 | 结果 |
+ | 正号 | +7 | 7 |
- | 负号 | a=7;-a | -7 |
+ | 加 | 9+7 | 16 |
- | 减 | 9-7 | 2 |
* | 乘 | 9*7 | 63 |
/ | 除 | 7/7 | 1 |
% | 取余 | 9%7 | 1 |
++ ++ | 自增(前):先运算后取值 自增(后):先取值后运算 | a=7;b=++a a=7;b=a++ | a=8;b=8 a=8;b=7 |
-- -- | 自减(前):先运算后取值 自减(后):先取值后运算 | a=7;b=--a a=7;b=a-- | a=6;b=6 a=6;b=7 |
5.1.1取余
#include<stdio.h>
void main() {
//因为9和7都为整数,所以结果中整数1后面的小数都被截断,只保留1
double a = 9 / 7;
printf("a = %f\n", a);
//若想要保留小数,则在参加运算的数字中,必须加上小数部分
double b = 9.0 / 7;
printf("b = %.15f\n", b);
//9 % 7 指的是9对7取余(取模)
int c = 9 % 7;
printf("c = %d\n", c);
//计算机中取模的公式为 a - a / b * b
//-9 - (-9) / 7 * 7
int d = -9 % 7;
printf("d = %d\n", d);
//9 - 9 / (-7) * (-7)
int e = 9 % -7;
printf("e = %d\n", e);
//(-9) - (-9) / (-7) * (-7)
int f = -9 % -7;
printf("f = %d\n", f);
}
计算机中取模的公式为 a - a / b * b
5.1.2 ++
#include<stdio.h>
void main() {
int a = 7;
int b = a++;//等价于b = a; a = a + 1;
printf("a = %d b = %d\n", a, b);
int c = ++a;//等价于a = a + 1; c = a;
printf("a = %d c = %d\n", a, c);
//++a和a++可以独立使用,但两者完全等价,都是a = a + 1;
++a;
printf("a = %d\n", a);
a++;
printf("a = %d", a);
}
- b = a++;//等价于b = a; a = a + 1;
- c = ++a;//等价于a = a + 1; c = a;
- ++a和a++可以独立使用,但两者完全等价,都是a = a + 1
5.1.3练习
- 假如还有97天放假,请问还有多少个星期零几天?
#include<stdio.h> void main() { int weeks, days; weeks = 97 / 7; days = 97 % 7; printf("距离放假还有 % d个星期零 % d天", weeks,days); }
-
定义一个变量保存华氏温度,华氏温度转换摄氏温度的公式为:5/9*(华氏温度-100),请求出华氏温度对应的摄氏温度。
#include<stdio.h> void main() { //华氏温度转换摄氏温度的公式为:5 / 9 * (华氏温度 - 100), double Fahrenhite = 97; double Centigrade = 5.0 / 9 * (Fahrenhite - 100); printf("%f对应的摄氏温度为%f", Fahrenhite, Centigrade); }
3.2关系运算符
3.2.1介绍
- 关系运算符的结果为真是非0,为假是0
- 关系表达式经常用在if或循环中
3.2.2关系运算符表示
运算符 | 运算 | 示例 | 结果 |
== | 相等于 | 9 == 7 | false |
!= | 不等于 | 9 != 7 | true |
> | 大于 | 9 > 7 | true |
< | 小于 | 9 < 7 | false |
>= | 大于等于 | 9 >= 7 | true |
<= | 小于等于 | 9<=7 | false |
3.2.3代码
#include<stdio.h>
void main() {
int a = 9;
int b = 7;
printf("a==b = %d\n",a==b);
printf("a!=b = %d\n", a != b);
printf("a>b = %d\n", a > b);
printf("a<b = %d\n", a < b);
printf("a>=b = %d\n", a >= b);
printf("a<=b = %d\n", a <= b);
}
3.3逻辑运算符
3.3.1介绍
用于连接多个条件(一般来讲就是关系表达式),最终的结果要么是真(非 0 表示),要么是 假(0 表示) 。
3.2.2逻辑运算符表示
设变量A为1,变量B为0
运算符 | 描述 | 示例 |
&& | 逻辑与运算符。只有两个操作数都为真,结果才为真;否则,则为假 | (A && B) 为假 |
|| | 逻辑或运算符。只要有一个操作数为真,结果就为真 | (A || B)为真 |
! | 逻辑非运算符。如果条件为真,则使其为假 | !(A || B)为假 |
3.2.3代码
3.2.3.1逻辑与运算符
#include<stdio.h>
void main() {
//double score = 97;
//double score = 79;
double score = 59;
if (score >= 80) {
printf("优秀");
}
else if (score >= 60 && score < 80) {
printf("良");
}
else {
printf("不合格");
}
}
#include<stdio.h>
void main() {
int a = 9, b = 7;
if (b < 8 && a++ > 9) {// a++ > 9判断中先进行a > 9的判断,再进行a++
printf("ok1\n");
}
printf("a = %d\n", a);
int c = 9, d = 7;
if (d < 8 && ++c > 9) {// ++c > 9判断中先进行c > 9的判断,再进行++c
printf("ok2\n");
}printf("c = %d\n", c);
int e = 9, f = 7;
if (f < 6 && ++e > 9) {// 如果在进行&&操作时,第一个判断的结果是false,则之后的条件就不再进行判断
printf("ok3\n");
}printf("e = %d", e);
}
3.2.3.2逻辑或运算
#include<stdio.h>
void main() {
int a = 9, b = 7;
if (a > 7 || b++ > 7) {//在进行逻辑与时候,第一个判断的结果是true,则之后的条件不再进行判断
printf("ok\n");
}
printf("b = %d\n", b);
}
3.2.3.3逻辑非运算
#include<stdio.h>
void main() {
//int score = 97;
int score = 79;
int result = score > 80;
if (result) {
printf("ok1\n");
}
if (!result) {//当result取反为真时
printf("ok2");
}
}
3.3赋值运算符
3.3.1介绍
赋值运算符就是将某个运算后的值,赋给指定的变量
3.3.2赋值运算符表示
运算符 | 描述 | 示例 |
---|---|---|
= | 把右边的操作数赋值给左边的操作数 | A = B + C等价于把 B + C的值赋值给A |
+= | 加且赋值运算符,把左边的操作数加上右边的操作数再赋值给左边的操作数 | A += B 等价于 A = A + B |
-= | 减且赋值运算符,把左边的操作数减去右边的操作数再赋值给左边的操作数 | A -= B 等价于 A = A - B |
*= | 乘且赋值运算符,把左边的操作数乘去右边的操作数再赋值给左边的操作数 | A *= B 等价于 A = A * B |
/= | 除且赋值运算符,把左边的操作数除去右边的操作数再赋值给左边的操作数 | A /= B 等价于 A = A / B |
%= | 求模且赋值运算符,把左边的操作数对去右边的操作数取模,再赋值给左边的操作数 | A %= B 等价于 A = A % B |
<<= | 左移且赋值运算符 | C <<= 2 等价于 C = C << 2 |
>>= | 右移且赋值运算符 | C >>= 2 等价于 C = C >> 2 |
&= | 按位与且赋值运算符 | C &= 2 等价于 C = C & 2 |
^= | 按位异或且赋值运算符 | C ^= 2 等价于 C = C ^ 2 |
|= | 按位或且赋值运算符 | C |= 2 等价于 C = C | 2 |
3.3.3代码
#include<stdio.h>
void main() {
//交换a与b的值
int a = 9;
int b = 7;
int temp = a;//设置一个临时变量保存a的值
a = b;//将b赋值给a
b = temp;//将temp赋值给b,即a原来的值复制给b,完成交换
printf("a = %d\tb = %d", a, b);
//+=示例
int c = 97;
c += a;
printf("c = %d", c);
}
- 运算顺序从右往左
- 赋值运算符的左边只能是变量,右边可以是变量、表达式、常量值
- 在运算时,如果被赋值的变量精度较小,则有可能会导致精度损失
3.4三元运算符
3.4.1基本语法
条件表达式 ? 条件1 :条件2;
- 如果条件表达式为非 0 (真),运算后的结果是表达式 1;
- 如果条件表达式为 0 (假),运算后的结果是表达式 2;
3.4.2代码
#include<stdio.h>
void main() {
int a = 9;
int b = 7;
int c = a > b ? a++ : --b;//a > b为真,因此a++赋值给c;而a++先进行赋值操作,即c = a,再进行 a = a + 1
printf("a = %d\nb = %d\nc =%d\n", a, b, c);
int d = 9;
int e = 7;
int f = d < e ? d++ : --e;//d < e为假,因此e--赋值给f;而e--先进行e = e - 1,在进行赋值操作
printf("d = %d\ne = %d\nf =%d\n", d, e, f);
//三元运算符中,如果被赋值的变量精度小于赋值变量,则会产生精度损失
int num1 = a > b ? 1.2 : 1.3;
printf("num1 = %d\n", num1);
//三元可以转换为eif else语句
int num2;
if (a > b) {
num2 = 1.2;
}
else {
num2 = 1.3;
}
printf("num2 = % d\n", num2);
}
- 三元运算符中,如果被赋值的变量精度小于赋值变量,则会产生精度损失
- 三元可以转换为eif else语句
3.4.3练习
输出三个数中的最大值
#include<stdio.h>
void main() {
int a = 9;
int b = 7;
int c = 97;
int temp = a > b ? a : b;
temp = temp > c ? temp : c;
printf(" a,b,c中的最大值为%d", temp);
}
3.5运算符优先级
- 结合的方向只有三个是从右向左,其余都是从左向右,分别是赋值运算符、单目运算和三目运算
- 逗号的运算符优先级最低
- 优先级的大概顺序为算数运算符>关系运算符>逻辑运算符(逻辑非除外,其优先级较高)>赋值运算符>逗号运算符
3.6标识符的命名规则和规范
3.6.1标识符的概念
- C语言对各种变量、函数等命名时使用的字符序列称为标识符
- 凡是自己可以起名字的地方都叫标识符
3.6.2标识符的命名规则
- 由 26 个英文字母大小写,0-9 ,_或 $ 组成
- 数字不可以开头
- 不可以使用关键字和保留字,但能包含关键字和保留字
- C语言中严格区分大小写,长度无限制
- 标识符不能包含空格
3.6.3标识符的规范
- 程序中不得出现仅靠大小写区分的相似的标识符
- 所有宏定义、枚举常数、常量(只读变量)全用大写字母命名,用下划线分隔单词
- 定义变量别忘了初始化。定义变量时编译器并不一定清空了这块内存,它的值可能是无效的数据, 运行程序, 会异常退出
- 变量名、函数名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写
3.6.4关键字
关键字的定义:被C语言赋予了特殊意义,用于专门用途的字符串
3.7键盘输入语句
3.7.1介绍
在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取。
3.7.2步骤
- #include<stdio.h>
- 使用scanf函数
- 使用恰当的格式参数接收输入
3.7.3代码
#include<stdio.h>
void main() {
char name[20] = "";
int age;
double sal = 0.0;
char gender ;
printf("请输入名字");//提示用户输入信息
scanf_s("%s", name, sizeof(name));//scanf_s("%s", name)表示接收一个字符串,并将其存入name数组中
printf("请输入年龄");
scanf_s("%d", &age);//将用户输入的信息存入name所指向的地址中,因此需要用&
printf("请输入薪水");
scanf_s("%lf", &sal);//在使用scanf时,double对应的参数是%lf
printf("请输入性别(m/f)");
scanf_s("%c", &gender, sizeof(gender));//第一个scanf接收回车
scanf_s("%c", &gender, sizeof(gender));//第二个scanf接收用户数据
printf("\n姓名为%s\t年龄为%d\t薪水为%f\t性别为%c", name, age, sal, gender);
}
3.8练习
- 定义变量保存 秒数,打印输出 xx 小时 xx 分钟 xx 秒
#include<stdio.h> void main() { int seconds = 0; int hours = 0; int minutes = 0; int leftSeconds = 0; printf("请输入秒数:"); scanf_s("%d", &seconds); hours = seconds / 3600; minutes = seconds % 3600 / 60; leftSeconds = seconds % 3600 % 60; printf("%d小时%d分%d秒", hours, minutes, leftSeconds); }
-
实现对三个整数进行排序,输出时按照从小到大的顺序输出
#include<stdio.h> void main() { int a = 0; int b = 0; int c = 0; int temp = 0; printf("请输入三个数字:"); scanf_s("%d%d%d", &a, &b, &c); if (a > b) { temp = a; } else { temp = b; b = a; a = temp; } if (a > c && b > c) { printf("这三个数字中最大的数字为%d,且它们的从大到小的顺序为%d %d %d", temp, a, b, c); } else if ( a > c && b < c){ printf("这三个数字中最大的数字为%d,且它们的从大到小的顺序为%d %d %d", temp, a, c, b); } else { printf("这三个数字中最大的数字为%d,且它们的从大到小的顺序为%d %d %d", c, c, a, b); } }