文章目录
前言
1、本教程和其他教程的不同点
其他教程:目前市面上的教程都是基于知识点出发,只进行知识点的讲解,读者读完后发现题目都不会做,无从下手。
本教程:从题目中学习C/C++知识点,根据刷题直接掌握,提高学习效率。
本教程会同时使用两种方法进行编写,学习C语言的也可以同时学习C++。
2、本教程后期会有配套的视频讲解,可以持续关注一下。
3、为什么开始写这份教程,最开始这份教程是用于培训小朋友信息学奥赛CSP-J定级的,后面感觉可能大学的一些小朋友们也需要,所以分享出来给大家。
4、此教程由一位名为天秀的小朋友为大家揭开C/C++的神秘面纱,大家可以通过编程帮助他解决各种各样的问题
1 C/C++的输出
1.1 天秀的第一个程序 Hello World
题目描述:
天秀小朋友今天带着他的小机器人来到了学校。在信息课上,他想让小机器人向全班同学打个招呼。他想用C语言和C++两种方式让小机器人说出“Hello,World!”。你能帮助天秀小朋友完成这个小挑战,编写出这两个程序吗?
C语言示例代码
#include <cstdio> //或者#include "stdio.h"两个头文件都可以
int main() {
printf("Hello, World!\n");
return 0;
}
#include <stdio.h>
这行代码告诉计算机,我们想要使用标准输入输出库。这个库是一个包含了很多有用功能的集合,就像我们的玩具箱有很多有趣的玩具一样。在这个程序中,我们使用了库中的一个工具:printf 函数,它可以在屏幕上打印出我们想要说的话。
int main() {
这行代码开始定义了一个叫做 “main” 的函数。每个C和C++程序都从 “main” 函数开始执行,就像每个故事都从"很久很久以前"开始一样。
printf(“Hello, World!\n”);
这行代码告诉计算机,我们要打印(在屏幕上显示)“Hello, World!“这句话。这个 “Hello, World!” 就像我们的小机器人要向大家打招呼的话一样。”\n” 是一个特殊的字符,表示换行,就像我们说完一句话后要停一停,开始新的一行。
return 0;
这行代码告诉计算机,我们的"main"故事(函数)到这里就结束了,然后我们给了它一个"0"作为结束的标记。在C和C++编程中,"0"通常表示一切都正常,就像说:"我们的故事很完美,没有错误。
}
这个符号表示我们的"main"函数到此结束。就像一个故事的"从此他们过上了幸福的生活"一样,我们的代码也需要一个结束的标志。这个大括号就是结束的标志。
案例 1
C++示例代码
#include <iostream>
int main() {
std::cout << "Hello, World!\n";
return 0;
}
在C++中,std::cout是一个已经在标准库中定义好的对象,它代表“字符输出流”,用于向标准输出(通常是屏幕或控制台窗口)发送数据。在std::cout << “Hello, World!\n”;这一行中,std::cout将字符串"Hello, World!\n"输出到标准输出。 这个符号<<我们称为插入运算符
为什么要使用std::这个前缀呢?这是因为cout对象是在名为std的命名空间中定义的。在C++中,命名空间是一种防止命名冲突的机制,允许我们创建在特定上下文中有效的标识符名称。
案列2
C++示例代码
#include <iostream>
using namespace std;
int main() {
cout << "Hello, World!\n";
return 0;
}
std命名空间包含了所有的标准库函数、对象和类型。因此,我们需要使用std::前缀来访问它们,除非我们在代码中指定了using namespace std;,这将允许我们在后续的代码中不再需要写std::前缀。
对于初学者而言,建议采用第二种比较简便的方式,包括后续我们都是采用using namespace std;这条指令来进行代码的编写
1.2 输出图形
题目描述:
天秀小朋友正在尝试一个有趣的挑战——使用计算机画出一个4x4的空心正方形!这个正方形的边是由星号(*)构成,但中间是空心的,没有星号。你能帮助天秀小朋友编写这样一个程序,让他的计算机能够画出这样一个空心正方形吗?
输入:
无
输出:
****
* *
* *
****
C语言示例代码
#include <stdio.h>
int main() {
// 输出第一行
printf("****\n");
// 输出中间两行
printf("* *\n");
printf("* *\n");
// 输出最后一行
printf("****\n");
return 0;
}
在C语言中,我们使用printf函数来输出文本。对于每一行,我们都使用一个printf语句来输出,\n代表新行。
C++示例代码
#include <iostream>
using namespace std;
int main() {
// 输出第一行
cout << "****" << endl;
// 输出中间两行
cout << "* *" << endl;
cout << "* *" << endl;
// 输出最后一行
cout << "****" << endl;
return 0;
}
在这段代码中,endl被用来产生换行。与\n不同的是,endl除了能产生换行外,还会立即刷新输出流,使得所有待输出的内容都被立即显示出来。
1.3 输出小猫
题目描述
天秀小朋友喜欢画画,他正在尝试用计算机画出一个可爱的小猫。请你帮助天秀小朋友编写一个程序,输出以下ASCII艺术的小猫形状:
/\_/\
( o.o )
> ^ <
C语言示例代码
#include <stdio.h>
int main() {
printf(" /\\_/\\ \n");
printf("( o.o )\n");
printf(" > ^ <\n");
return 0;
}
C++示例代码
#include <iostream>
using namespace std;
int main() {
cout << " /\\_/\\ " << endl;
cout << "( o.o )" << endl;
cout << " > ^ <" << endl;
return 0;
}
在C和C++中,反斜杠(\)是一个特殊字符,用于表示转义序列(Escape Sequence)。转义序列允许在字符串中插入一些特殊的字符,这些字符在普通情况下是无法直接输入的。
在题解的代码中,我们使用了\来创建一些转义序列:
/\:这个序列代表一个斜线和一个反斜杠字符的组合。在普通的字符串中,斜线和反斜杠都是特殊字符,为了让它们正常显示,我们使用反斜杠进行转义。
下面是一个包含原始符号和相应转义序列的总结表格:
中文词 | 原始符号 | 转义序列 |
---|---|---|
反斜杠 | \ | \\ |
引号 | " | \" |
单引号 | ’ | \’ |
换行符 | \n | \n |
制表符 | \t | \t |
回车符 | \r | \r |
斜杠 | / | \/ |
1.4 打印中文
天秀小朋友最近参与了一项名为 “天秀腾飞计划” 的活动,他想编写一个C语言和一个C++的程序,来打印出这个活动的名字。你能帮助天秀小朋友完成这个小挑战,编写出这两个程序吗?
C语言示例代码
#include <stdio.h>
int main() {
printf("天秀腾飞计划\n");
return 0;
}
C++示例代码
#include <iostream>
using namespace std;
int main() {
cout << "天秀腾飞计划" << endl;
return 0;
}
2 C/C++的输入
C语言输入输出表格:
中文名称 | 数据类型 | scanf()格式化字符 | printf()格式化字符 |
---|---|---|---|
整型 | int | %d | %d |
短整型 | short int | %hd | %hd |
长整型 | long int | %ld | %ld |
长长整型 | long long int | %lld | %lld |
无符号整型 | unsigned int | %u | %u |
字符型 | char | %c | %c |
浮点型 | float | %f | %f |
双精度浮点型 | double | %lf | %lf |
长双精度浮点型 | long double | %Lf | %Lf |
字符串型 | string | %s | %s |
2.1 整数数据类型的输入
天秀小朋友在数学课上学习了数的交换规则,他想试试看是否可以在编程中应用这个规则。他想编写一个C语言和一个C++的程序,输入两个数a和b,然后交换他们的值。你能帮助天秀小朋友完成这个小挑战,编写出这两个程序吗?
C语言示例代码
#include <stdio.h>
int main() {
int a, b, temp;
printf("请输入两个数:\n");
scanf("%d%d", &a, &b);
temp = a;
a = b;
b = temp;
printf("交换后的数值:a = %d, b = %d\n", a, b);
return 0;
}
基础的语法结构:程序的主函数 main(),以及大括号 {} 的使用来定义函数体。
基础的语法结构:程序的主函数 main(),以及大括号 {} 的使用来定义函数体。
变量定义和赋值:int a, b, temp; 这行代码定义了三个整型变量 a,b 和 temp,后续还进行了赋值操作。
输入输出函数:printf() 和 scanf() 分别用于格式化输出和输入。例如,printf(“请输入两个数:\n”); 用于输出提示信息,scanf(“%d%d”, &a, &b); 用于从用户处读取两个整数并存储在 a 和 b 中。
地址操作符:在 scanf(“%d%d”, &a, &b); 中,& 符号获取变量 a 和 b 的地址,因为 scanf() 需要变量的地址来存储用户输入的值。
C++示例代码
#include <iostream>
using namespace std;
int main() {
int a, b, temp;
cout << "请输入两个数:" << endl;
cin >> a >> b;
temp = a;
a = b;
b = temp;
cout << "交换后的值:a = " << a << ", b = " << b << endl;
return 0;
}
2.2 单精度浮点型数据类型的输入
天秀小朋友在课堂上学习了单精度浮点数,并且他想要编写一个C和C++的程序,该程序能够输入两个浮点数,然后只输出第二个浮点数。你能帮助天秀小朋友完成这个小挑战,编写出这个程序吗?
输入:
1.23 4.56
输出
4.56
C语言示例代码
#include <stdio.h>
int main() {
float a, b;
printf("天秀小朋友,请输入两个浮点数:\n");
scanf("%f %f", &a, &b);
printf("你输入的第二个浮点数是:%f\n", b);
return 0;
}
C++示例代码
#include <iostream>
using namespace std;
int main() {
float a, b;
cout << "天秀小朋友,请输入两个浮点数:" << endl;
cin >> a >> b;
cout << "你输入的第二个浮点数是:" << b << endl;
return 0;
}
2.3 双精度浮点型数据类型的输入
天秀小朋友在课堂上学习了双精度浮点数,并且他想要编写一个C和C++的程序,该程序能够输入两个浮点数,然后交换这两个浮点数进行输出。你能帮助天秀小朋友完成这个小挑战,编写出这个程序吗?
输入:
1.23452 4.562352
输出
4.56
C语言示例代码
#include <stdio.h>
int main() {
double a, b, temp;
printf("天秀小朋友,请输入两个双精度浮点数:\n");
scanf("%lf %lf", &a, &b);
temp = a;
a = b;
b = temp;
printf("交换后的两个数是:%lf 和 %lf\n", a, b);
return 0;
}
C++示例代码
#include <iostream>
using namespace std;
int main() {
double a, b, temp;
cout << "天秀小朋友,请输入两个双精度浮点数:" << endl;
cin >> a >> b;
temp = a;
a = b;
b = temp;
cout << "交换后的两个数是:" << a << " 和 " << b << endl;
return 0;
}
2.3 字符类型数据类型的输入
天秀小朋友在学习了字符和输出函数后,他希望使用输入的一个字符来画一个空心的长方形。但他不想用循环,他希望直接用cout或printf就能完成。你能帮助天秀小朋友完成这个小挑战,编写出这个程序吗?
输入
*
输出
**********
* *
* *
* *
**********
C语言示例代码
#include <stdio.h>
int main() {
char c;
printf("天秀小朋友,请输入一个字符:\n");
scanf(" %c", &c);
// 打印顶部
printf("%c%c%c%c%c%c%c%c%c%c\n", c, c, c, c, c, c, c, c, c, c);
// 打印中间的空心部分
printf("%c %c\n", c, c);
printf("%c %c\n", c, c);
printf("%c %c\n", c, c);
// 打印底部
printf("%c%c%c%c%c%c%c%c%c%c\n", c, c, c, c, c, c, c, c, c, c);
return 0;
}
C++示例代码
#include <iostream>
using namespace std;
int main() {
char c;
cout << "天秀小朋友,请输入一个字符:" << endl;
cin >> c;
// 打印顶部
cout << c << c << c << c << c << c << c << c << c << c << endl;
// 打印中间的空心部分
cout << c << " " << c << endl;
cout << c << " " << c << endl;
cout << c << " " << c << endl;
// 打印底部
cout << c << c << c << c << c << c << c << c << c << c << endl;
return 0;
}
3 C/C++数据类型存储空间
3.1 整型数据类型存储空间
以下是整型数据类型的表格:
数据类型 | 存储空间大小 (字节) | 数据范围 (2的次方) | 数据范围 |
---|---|---|---|
short | 2 | 16 (2⁻¹⁵ 到 2¹⁵-1) | -32,768 到 32,767 |
int | 4 | 32 (2⁻³¹ 到 2³¹-1) | -2,147,483,648 到 2,147,483,647 |
long | 4 (或8) | 32 (2⁻³¹ 到 2³¹-1) 或 64 (2⁻⁶³ 到 2⁶³-1) | -2,147,483,648 到 2,147,483,647 (如果long为4字节) 或 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 (如果long为8字节) |
long long | 8 | 64 (2⁻⁶³ 到 2⁶³-1) | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
在一个奇妙的魔幻世界中,天秀小朋友遇到了一位编程精灵机器人。天秀小朋友好奇地问道:“机器人先生,你能告诉我C++中的short、int、long和long long这四种数据类型在内存中各占多少空间吗?”机器人微笑着回答:“我可以告诉你,但你需要自己写一段C/C++程序来得到答案。”你能帮助天秀小朋友完成这个任务吗?
案列1
C语言示例代码
#include <stdio.h>
int main() {
// 使用 sizeof 运算符来获取数据类型的大小
printf("short 类型占用的字节数: %lu\n", sizeof(short)); // 输出 short 类型的大小
printf("int 类型占用的字节数: %lu\n", sizeof(int)); // 输出 int 类型的大小
printf("long 类型占用的字节数: %lu\n", sizeof(long)); // 输出 long 类型的大小
printf("long long 类型占用的字节数: %lu\n", sizeof(long long)); // 输出 long long 类型的大小
return 0;
}
sizeof运算符返回的是size_t类型,这是一种无符号整数类型。在 C 语言中,size_t类型通常是用来计数的,例如数组索引和循环计数。因为索引和计数通常不会是负数,所以size_t类型是无符号的。
在printf函数中,我们需要使用一个特定的格式化指示符来打印size_t类型的值,这个指示符是%zu。
案列 2
而%u是用于打印标准的无符号整数(unsigned int)。虽然size_t类型也是无符号的,但它的大小可能与unsigned int不同。在某些平台上,size_t可能比unsigned int大,这就是为什么我们需要使用%zu,而不是%u。
案列2
C语言示例代码
#include <stdio.h>
int main() {
// 定义各种类型的变量
short a;
int b;
long c;
long long d;
// 使用 sizeof 运算符来获取数据类型的大小
printf("short 类型占用的字节数: %zu\n", sizeof(a)); // 输出 short 类型的大小
printf("int 类型占用的字节数: %zu\n", sizeof(b)); // 输出 int 类型的大小
printf("long 类型占用的字节数: %zu\n", sizeof(c)); // 输出 long 类型的大小
printf("long long 类型占用的字节数: %zu\n", sizeof(d)); // 输出 long long 类型的大小
return 0;
}
sizeof()函数不仅可以传入数据类型,也可以传入数据类型所定义的变量。
案列3
C语言示例代码
#include <stdio.h>
int main() {
// 定义各种类型的变量
short a;
int b;
long c;
long long d;
// 使用 sizeof 运算符来获取数据类型的大小,并将结果强制转换为 int 类型
printf("short 类型占用的字节数: %d\n", (int)sizeof(a)); // 输出 short 类型的大小
printf("int 类型占用的字节数: %d\n", (int)sizeof(b)); // 输出 int 类型的大小
printf("long 类型占用的字节数: %d\n", (int)sizeof(c)); // 输出 long 类型的大小
printf("long long 类型占用的字节数: %d\n", (int)sizeof(d)); // 输出 long long 类型的大小
return 0;
}
在 C++ 中,可以使用 int(sizeof(d)) 这种格式。但在 C 语言中,你应该使用 (int)sizeof(d) 这种格式。这两种格式都是类型转换,意思是将 sizeof(d) 的结果转换为 int 类型。
在 C++ 中,int(sizeof(d)) 是函数风格的强制类型转换,而 (int)sizeof(d) 是传统的C语言风格的强制类型转换。虽然它们都有相同的功能,但是 int(sizeof(d)) 的风格在C++中更常见。
然而,在 C 语言中,只有 (int)sizeof(d) 这种风格是有效的,因为 C 语言不支持函数风格的强制类型转换。
C++示例代码
#include <iostream>
using namespace std;
int main() {
// 使用 sizeof 运算符来获取数据类型的大小
cout << "short 类型占用的字节数: " << sizeof(short) << endl; // 输出 short 类型的大小
cout << "int 类型占用的字节数: " << sizeof(int) << endl; // 输出 int 类型的大小
cout << "long 类型占用的字节数: " << sizeof(long) << endl; // 输出 long 类型的大小
cout << "long long 类型占用的字节数: " << sizeof(long long) << endl; // 输出 long long 类型的大小
return 0;
}
在C++中,使用cout打印变量值时,我们不需要指定数据类型的格式化字符,这与C语言的printf函数有很大的不同。cout是C++中的一种流操作,它可以自动识别不同数据类型,因此不需要像printf那样使用%d、%u、%f等格式化字符。
3.2 浮点型数据类型存储空间
数据类型 | 存储空间大小 (字节) | 数值范围 |
---|---|---|
float | 4 | 1.2E-38 to 3.4E+38 |
double | 8 | 2.3E-308 to 1.7E+308 |
long double | 16 (在大部分系统中) | 3.4E-4932 to 1.1E+4932 |
"3.4E-4932" 和 "1.1E+4932" 这种表示法被称为科学计数法或者指数记数法。
在科学和工程领域,科学计数法常用于表示非常大或者非常小的数值。
在科学计数法中:
"E" 或者 "e" 的意思是 "乘以10的幂"。
"E" 或 "e" 后面的数字表示指数。
例如:
"3.4E-4932" 的意思是 "3.4 乘以 10的-4932次方"。这是一个非常小的数。
"1.1E+4932" 的意思是 "1.1 乘以 10的4932次方"。这是一个非常大的数。
以下是C语言中如何表示科学计数法的例子:
double small_num = 3.4E-4932; // 非常小的数
double big_num = 1.1E+4932; // 非常大的数
假设我们要表示光的速度,那么在标准单位(米/秒)下,光的速度是 300,000,000 m/s,
我们通常使用科学计数法来表示这个数值,如 "3.0E8"。
在这个例子中,"3.0E8" 就等于 "3.0 乘以10的8次方",也就是 300,000,000。
再比如说,一个电子的质量大约是 0.000000000000000000000000000000911 kg
我们通常使用科学计数法来表示这个数值,如 "9.11E-31"。
在这个例子中,"9.11E-31" 就等于 "9.11 乘以10的-31次方",也就是 0.000000000000000000000000000000911。
请注意:这个表格是按照IEEE 754标准给出的,但具体数值可能会根据特定的编译器和操作系统有所不同。
天秀小朋友一直对计算机世界充满了好奇,他最近在学习C和C++语言时,突然想知道不同的浮点数在计算机中占用的存储空间大小。他想要知道float、double和long double这三种浮点数类型分别占用多少字节的存储空间。你能帮助天秀小朋友编写一个C和一个C++程序,用来打印出这三种浮点数类型在你的计算机中占用的存储空间大小吗?
C语言示例代码
#include <stdio.h>
int main() {
// 打印float、double和long double的大小
printf("float 类型占用的字节数: %zu\n", sizeof(float));
printf("double 类型占用的字节数: %zu\n", sizeof(double));
printf("long double 类型占用的字节数: %zu\n", sizeof(long double));
return 0;
}
C++示例代码
#include <iostream>
using namespace std;
int main() {
// 打印float、double和long double的大小
cout << "float 类型占用的字节数: " << sizeof(float) << endl;
cout << "double 类型占用的字节数: " << sizeof(double) << endl;
cout << "long double 类型占用的字节数: " << sizeof(long double) << endl;
return 0;
}
3.2 字符型数据类型存储空间
字符常量对应的ASCII值
ASCII码值 | 字符 | ASCII码值 | 字符 | ASCII码值 | 字符 | ASCII码值 | 字符 |
---|---|---|---|---|---|---|---|
32 | 空格 | 48 | 0 | 65 | A | 97 | a |
33 | ! | 49 | 1 | 66 | B | 98 | b |
34 | " | 50 | 2 | 67 | C | 99 | c |
35 | # | 51 | 3 | 68 | D | 100 | d |
36 | $ | 52 | 4 | 69 | E | 101 | e |
37 | % | 53 | 5 | 70 | F | 102 | f |
38 | & | 54 | 6 | 71 | G | 103 | g |
39 | ’ | 55 | 7 | 72 | H | 104 | h |
40 | ( | 56 | 8 | 73 | I | 105 | i |
41 | ) | 57 | 9 | 74 | J | 106 | j |
当天秀小朋友正在玩一个神奇的游戏,这个游戏可以将任何他输入的字符转化为神秘的ASCII码。让我们来看看天秀小朋友是如何在这个游戏中完成挑战的吧!
题目:
天秀小朋友需要编写一个程序,这个程序可以接受他输入的任何字符,然后将这个字符转化为ASCII码并输出。天秀小朋友是否能够完成这个挑战呢?
要求:
天秀小朋友需要用C语言和C++语言分别实现这个程序。
程序中需要有明确的输入提示和输出格式。
程序需要能够正确的接受输入并输出相应的ASCII码
C语言示例代码
#include <stdio.h>
int main() {
char ch; // 天秀小朋友创建一个字符变量 ch
printf("亲爱的天秀小朋友,请输入一个字符:"); // 提示天秀小朋友输入一个字符
scanf("%c", &ch); // 天秀小朋友输入一个字符
printf("这个字符的ASCII码是:%d\n", ch); // 输出这个字符的ASCII码
return 0;
}
C++示例代码
#include <iostream>
using namespace std;
int main() {
char ch; // 天秀小朋友创建一个字符变量 ch
cout << "亲爱的天秀小朋友,请输入一个字符:"; // 提示天秀小朋友输入一个字符
cin >> ch; // 天秀小朋友输入一个字符
cout << "这个字符的ASCII码是:" << (int)ch << endl; // 输出这个字符的ASCII码
return 0;
}
天秀小朋友最近在学习ASCII字符,他想写一个程序来玩一玩。他想要输入一个整数,然后程序会将这个整数转换为对应的ASCII字符进行输出。例如,如果他输入65,程序就会输出A。你能帮助天秀小朋友编写这个程序吗?这个程序需要能够在C和C++两种编程语言中运行。
C语言示例代码
#include <stdio.h>
int main() {
int num; // 天秀小朋友创建一个整数变量 num
printf("亲爱的天秀小朋友,请输入一个数字:"); // 提示天秀小朋友输入一个数字
scanf("%d", &num); // 天秀小朋友输入一个数字
printf("这个数字对应的ASCII字符是:%c\n", num); // 输出这个数字对应的ASCII字符
return 0;
}
C++示例代码
#include <iostream>
using namespace std;
int main() {
int num; // 天秀小朋友创建一个整数变量 num
cout << "亲爱的天秀小朋友,请输入一个数字:"; // 提示天秀小朋友输入一个数字
cin >> num; // 天秀小朋友输入一个数字
cout << "这个数字对应的ASCII字符是:" << (char)num << endl; // 输出这个数字对应的ASCII字符
return 0;
}
4 C/C++运算符
4.1 算数运算符
运算符 | 名称 | 描述 | 示例 | 结果 |
---|---|---|---|---|
+ | 加法 | 将两个值相加 | 5 + 2 | 7 |
- | 减法 | 从第一个值中减去第二个值 | 5 - 2 | 3 |
* | 乘法 | 将两个值相乘 | 5 * 2 | 10 |
/ | 除法 | 将第一个值除以第二个值 | 5 / 2 | 2.5 |
% | 取模 | 返回除法的余数 | 5 % 2 | 1 |
++a | 前缀递增 | 先增加值,然后进行后续运算 | ++a(a为5) | 6 |
a++ | 后缀递增 | 先进行后续运算,再增加值 | a++(a为5) | 5 |
- -a | 前缀递减 | 先减少值,然后进行后续运算 | - -a(a为5) | 4 |
a- - | 后缀递减 | 先进行后续运算,再减少值 | a- -(a为5) | 5 |
算数运算符用于执行基本的数学运算,比如加法、减法、乘法、除法等。以下是算数运算符的主要特点:
基本运算:加法、减法、乘法、除法和取模是五种基本的算数运算。每一种运算都对应一个特定的算数运算符:+、-、*、/ 和 %。
一元和二元:大多数算数运算符是二元运算符,也就是说它们操作两个值。
比如在表达式a + b中,"+"是一个二元运算符,它操作a和b两个值。但是,"-"也可以作为一元运算符来表示负数,比如-a。
优先级和结合性:算数运算符有各自的优先级,比如乘法和除法的优先级高于加法和减法。
在有多个运算符的表达式中,优先级更高的运算符会先被执行。
如果优先级相同,那么就按照运算符的结合性来执行,C++中大多数算数运算符的结合性是从左到右。
自增和自减:自增运算符(++)和自减运算符(--)可以作为一元运算符,它们会增加或减少一个变量的值。
这两个运算符还有前缀和后缀两种形式,比如++a和a++,它们的区别在于,前缀形式会先改变变量的值,
然后返回新的值,而后缀形式会先返回变量的原值,然后再改变变量的值。
数据类型:算数运算符可以用于整数和浮点数。整数除法会得到整数结果,浮点数除法会得到浮点数结果。取模运算符只能用于整数。
重载:在C++中,算数运算符可以被重载,这使得我们可以对自定义的数据类型进行算数运算。
天秀小朋友刚刚开始学习C++编程,他找到了一个程序,该程序使用了各种算数运算符,并通过计算并输出结果以示范它们的使用。天秀小朋友非常好奇,他想知道如果更改这些运算符中的一些变量的值,程序会输出什么样的结果
案列1
C语言示例代码:
#include <stdio.h>
int main() {
int a = 10, b = 4;
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); // 取模
// 前缀递增
int c = 5;
printf("++c = %d\n", ++c); // 先递增c,然后输出c
// 后缀递增
int d = 5;
printf("d++ = %d\n", d++); // 先输出d,然后递增d
// 前缀递减
int e = 5;
printf("--e = %d\n", --e); // 先递减e,然后输出e
// 后缀递减
int f = 5;
printf("f-- = %d\n", f--); // 先输出f,然后递减f
return 0;
}
案列1
C++示例代码
#include <iostream>
using namespace std;
int main() {
int a = 10, b = 4;
cout << "a + b = " << a + b << endl; // 加法
cout << "a - b = " << a - b << endl; // 减法
cout << "a * b = " << a * b << endl; // 乘法
cout << "a / b = " << a / b << endl; // 除法
cout << "a % b = " << a % b << endl; // 取模
// 前缀递增
int c = 5;
cout << "++c = " << ++c << endl; // 先递增c,然后输出c
// 后缀递增
int d = 5;
cout << "d++ = " << d++ << endl; // 先输出d,然后递增d
// 前缀递减
int e = 5;
cout << "--e = " << --e << endl; // 先递减e,然后输出e
// 后缀递减
int f = 5;
cout << "f-- = " << f-- << endl; // 先输出f,然后递减f
return 0;
}
案列2
C语言示例代码:
#include <stdio.h>
int main() {
int a = 5, b = 17; // 将a的值设为5,b的值设为17
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); // 取模
// 前缀递增
int c = 5;
printf("++c = %d\n", ++c); // 先递增c,然后输出c
// 后缀递增
int d = 5;
printf("d++ = %d\n", d++); // 先输出d,然后递增d
// 前缀递减
int e = 5;
printf("--e = %d\n", --e); // 先递减e,然后输出e
// 后缀递减
int f = 5;
printf("f-- = %d\n", f--); // 先输出f,然后递减f
return 0;
}
案列2
C++示例代码:
#include <iostream>
using namespace std;
int main() {
int a = 5, b = 17; // 将a的值设为5,b的值设为17
cout << "a + b = " << a + b << endl; // 加法
cout << "a - b = " << a - b << endl; // 减法
cout << "a * b = " << a * b << endl; // 乘法
cout << "a / b = " << a / b << endl; // 除法
cout << "a % b = " << a % b << endl; // 取模
// 前缀递增
int c = 5;
cout << "++c = " << ++c << endl; // 先递增c,然后输出c
// 后缀递增
int d = 5;
cout << "d++ = " << d++ << endl; // 先输出d,然后递增d
// 前缀递减
int e = 5;
cout << "--e = " << --e << endl; // 先递减e,然后输出e
// 后缀递减
int f = 5;
cout << "f-- = " << f-- << endl; // 先输出f,然后递减f
return 0;
}
4.2 关系运算符
运算符 | 名称 | 描述 | 示例 | 结果 |
---|---|---|---|---|
== | 等于 | 如果两个值相等,则结果为真 | 5 == 5 | true |
!= | 不等于 | 如果两个值不相等,则结果为真 | 5 != 2 | true |
> | 大于 | 如果左边的值大于右边的值,则结果为真 | 5 > 2 | true |
< | 小于 | 如果左边的值小于右边的值,则结果为真 | 2 < 5 | true |
>= | 大于或等于 | 如果左边的值大于或等于右边的值,则结果为真 | 5 >= 5 | true |
<= | 小于或等于 | 如果左边的值小于或等于右边的值,则结果为真 | 2 <= 5 | true |
关系运算符用于比较两个值之间的关系,并返回一个布尔值,即真(true)或假(false)。以下是关系运算符的主要特点:
返回值:关系运算符的结果总是一个布尔值。如果关系成立,则结果为真(true,或在C/C++中通常表示为1)。
如果关系不成立,则结果为假(false,或在C/C++中通常表示为0)。
二元运算符:关系运算符总是在两个操作数之间使用。例如,表达式a < b比较了a和b的值。
用途:关系运算符常用于控制结构(如if语句或while循环)中,决定程序的执行路径。
类型:关系运算符可以用于任何可以比较的数据类型,包括整数类型、浮点类型、字符类型等。
但请注意,不是所有的数据类型都可以进行比较,例如,数组类型就不能直接使用关系运算符进行比较。
优先级和结合性:关系运算符的优先级高于赋值运算符,低于算术运算符。它们的结合性从左到右。
重载:在C++中,关系运算符可以被重载,这使得我们可以定义自己的类或结构的比较方式。
C语言示例代码:
#include <stdio.h>
int main() {
int a = 5, b = 2;
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); // 小于或等于
return 0;
}
C++示例代码:
#include <iostream>
using namespace std;
int main() {
int a = 5, b = 2;
cout << "a == b: " << (a == b) << endl; // 等于
cout << "a != b: " << (a != b) << endl; // 不等于
cout << "a > b: " << (a > b) << endl; // 大于
cout << "a < b: " << (a < b) << endl; // 小于
cout << "a >= b: " << (a >= b) << endl; // 大于或等于
cout << "a <= b: " << (a <= b) << endl; // 小于或等于
return 0;
}
这些代码可以显示变量a和b之间的各种关系。在C和C++中,true被解释为1,false被解释为0。
4.3 逻辑运算符
运算符 | 名称 | 描述 | 示例 | 结果 |
---|---|---|---|---|
&& | 逻辑与 | 如果两个操作数都为真,则条件为真 | (5 > 3) && (2 < 4) | true |
|| | 逻辑或 | 如果两个操作数中有任意一个为真,则条件为真 | (5 == 3) || (2 < 4) | true |
! | 逻辑非 | 如果条件为真,则逻辑非运算符将使其为假;如果条件为假,则逻辑非运算符将使其为真 | !(5 == 3) | true |
逻辑运算符是用于连接和修改表达式的运算符,它们返回一个布尔结果(真或假)。以下是关于C++中的逻辑运算符的几个主要特点:
二元运算符:与(&&)和或(||)是二元运算符,需要两个操作数,例如 expr1 && expr2 和 expr1 || expr2。
一元运算符:非(!)是一元运算符,只需要一个操作数,例如 !expr。
布尔结果:逻辑运算符的结果总是一个布尔值,即 true 或 false。
短路行为:逻辑运算符有短路行为。对于逻辑与运算符 (&&),如果左侧的表达式结果为 false,
则整个表达式的结果就已经可以确定为 false,此时不会再去计算右侧的表达式。
对于逻辑或运算符 (||),如果左侧的表达式结果为 true,则整个表达式的结果就已经可以确定为 true,此时不会再去计算右侧的表达式。
优先级和结合性:逻辑运算符的优先级较低(比关系运算符和算术运算符都低),因此通常需要使用括号来改变运算顺序。
逻辑运算符的结合性是从左到右。
广泛用途:逻辑运算符常常被用在各种条件判断中,例如 if 语句、while 循环等,以确定是否执行特定的代码块。
持续更新中----