算数运算符
算数运算符功能列表
算数运算符 | 说明 | 算术运算符 | 说明 |
+ | 加法运算符 | / | 除法运算符 |
- | 减法运算符 | % | 求模运算符 |
* | 乘法运算符 |
|
|
#include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int result = 1; int i = 0; int count = 0; char Text[128]; char cryptograph[128]; while (1) { if (result == 1) { printf ("请输入要加密的明文:\n"); scanf_s ("%s",&Text,128); count = strlen(Text); for (i = 0; i < count; i++) { cryptograph[i] = Text[i] + i + 5; } cryptograph[i] = '\0'; printf("加密后的密文是:%s\n", cryptograph); } else if (result == 2) { count = strlen(cryptograph); for (i = 0; i < count; i++) { Text[i] = cryptograph[i] - i - 5; } Text[i] = '\0'; printf ("解密后的明文是:%s\n",Text); } else if (result == 3) { break; } else { printf ("请输入正确的命令符:\n"); } printf ("输入1机密新的明文,输入2对刚加密的密文进行解密,输入3退出系统:\n"); printf ("请输入命令符:\n"); scanf_s ("%d",&result); } return 0; }
位运算符
在计算机中,数据都是以二进制形式表示的,以字节为最小单位进行存储。一个字节分为8位,每一位可以表示一个二进制数0或1。为了能够对一个字节中的某一位或几位进行操作,C++提供了6种位运算符。
位运算符表
位运算符 | 名称 | 说明 |
|
| 当两个二进制位进行按位与运算时,如果两个二进制位都是1,则结果为1;如果至少有一个二进制位是0,则结果为0 |
| | 按位或运算 | 当两个二进制位进行或运算时,只要有一个二进制位为1,则结果为1,当两个二进制位都是0时,结果为0 |
^ | 按位异或 | 按位异或运算时指两个相应的二进位均相同,则结果为0,否则结果为1 |
~ | 按位取反 | 取反运算符~用于对一个二进制数按位取反,即将0转换为1,将1转换为0 |
|
| 左移运算是将一个二进制操作数对象按指定的移动的位数向左移,左边(高位端)溢出的位被丢弃,右边(低位端)的空位用0补充。相当于乘以2的幂 |
>> | 右移运算 | 右移运算符与左移运算符相反,是将一个数的二进制位右移若干位,并在左侧补0 |
注意:在进行右移时对于有符号数需要注意符号位问题,当为整数时,最高位补0,而为负数时,最高位是补0还是补1取决于编译系统的规定。
#include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int iVar = 18; int jVar = 10; cout << "转换前iVar = " << iVar << "\n"; cout << "转换前jVar = " << jVar << "\n"; iVar = iVar ^ jVar; jVar = iVar ^ jVar; iVar = jVar ^ iVar; cout << "转换后iVar = " << iVar << "\n"; cout << "转换后jVar = " << jVar << "\n"; int a = 2, b = 4, c = 6, d = 8; unsigned result; result = a&c; printf ("a&c = %u",result); result = b | d; printf("\nb | d = %u", result); result = a^d; printf("\na^d = %u", result); result = ~a; printf("\n~a = %u", result); system("Pause"); return 0; }
三目元运算符
在C++语言中,三目元表达式是由唯一的一个三目元运算符”? :”构成的,该运算符称为条件运算符,条件运算符要求有3个操作数对象。该运算符的一般形式如下:
表达式1?表达式2:表达式3
条件运算符的执行顺序如下:先求出表达式1的值,如果值为真,则对表达式2进行求解,并将表达式2的值作为整个三目元表达式的值;如果表达式1的值为假,则对表达式3进行求解,并将表达式3的值作为整个三目元表达式的值。
注意事项:
在使用三目元运算符时,通常会用括号将条件部分括起来。其实,就算不括起来也是可以的,因为三目元运算符的优先级比较低,在计算时,同样会先计算条件部分。而同时,三目元运算符的优先级还高于赋值运算符,比关系运算符和算数运算符都低,所以即使不加括号也可以使用。
条件运算符的结合方向为“自右至左”。
在条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同。
#include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { char name[6]; int sex; printf ("请输入姓名:\n"); scanf_s ("%s",name,6); printf ("请输入1或0,1表示男,0表示女:\n"); scanf_s ("%d",&sex); printf ("姓名:%s\n",name); char *strSex = (sex == 1) ? "男" : "女"; printf ("性别:%s\n",strSex); system("Pause"); return 0; }
定义带参数的宏
宏定义的语法如下:
#define 宏名(参数表) 字符串
注意事项:
(1)对带参数的宏的展开只是将语句中的宏名后面括号内的实参字符串代替#define命令行中的形参。
(2)在宏定义时,在宏名与带参数的括号之间不可以加空格,否则将空格以后的字符都作为替代字符串的一部分。
(3)在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。
(4)宏定义是用宏名替换字符串,但不进行正确性检查。
(5)宏定义不用在行末加分号。
(6)#define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到源文件结束。
(7)可以使用#undef命令终止宏定义的作用域。
(8)在进行宏定义时,可以引用已定义的宏名,可以层层替换。
(9)在程序中用双引号包起来的字符串内的字符,不进行替换。
#include "stdafx.h" #include <iostream> #define swap(a,b){int c;c=a;a=b;b=c;} using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int i, a[10], b[10]; printf ("请向数组a中输入10个数:\n"); for (i = 0; i < 10; i++) { scanf_s("%d", &a[i]); } printf ("显示数组a:\n"); for (i = 0; i < 10; i++) { printf ("%d,",a[i]); } printf("请向数组b中输入10个数:\n"); for (i = 0; i < 10; i++) { scanf_s("%d", &b[i]); } printf("\n显示数组b:\n"); for (i = 0; i < 10; i++) { printf("%d,", b[i]); } for (i = 0; i < 10; i++) swap(a[i], b[i]); printf ("\n输出转换后的数组a:\n"); for (i = 0; i < 10; i++) { printf ("%d,",a[i]); } printf("\n输出转换后的数组b:\n"); for (i = 0; i < 10; i++) { printf("%d,", b[i]); } system("Pause"); return 0; }
Rand()
程序中用到rand()的作用是产生一个随机数并返回这个数,a=rand()%max;的具体含义就是产生max以内的任意随机数(不含max本身)。
设定随机种子
为了每次运行同一程序得到的随机序列不是相同的,以系统时间来设定种子,即srand((unsigned long)time(0))。其中,需引用#include "time.h"。
#include "stdafx.h" #include <iostream> #include "time.h" #include "conio.h" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int a,b,c,sign,max; char sign1; printf ("请输入运算符(1或者其他数字,1表示:-,其他数字表示:+):\n"); scanf_s ("%d",&sign); printf ("请输入加减时的最大范围(<1000):\n"); scanf_s ("%d",&max); srand((unsigned long)time(0)); a = rand() % max; b = rand() % max; while ((a < b) && (sign == 1)) { a = rand() % max; b = rand() % max; } sign1 = (sign == 1 ? '-' : '+'); printf("\n%d%c%d=",a,sign1,b); scanf_s("%d",&c); if ((sign == 1) && (a - b == c) || (sign != 1) && (a + b == c)) printf("OK!\n"); else printf("答错了!\n"); _getch(); system("Pause"); return 0; }