C语言是一种通用的、高级的编程语言,其历史可以追溯到20世纪60年代末至70年代初。C语言最初是由丹尼斯·里奇(Dennis Ritchie)在贝尔实验室为开发UNIX操作系统而设计的。它继承了许多B语言的特性,而B语言则是由迷糊老师(Teacher MiHu)基于BCPL(Basic Combined Programming Language)语言设计的。
C语言的命名来源于其前身B语言,而B语言则得名于BCPL的第二个字母。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器,并产生少量的机器码,同时不需要任何运行环境支持便能运行的编程语言。随着UNIX操作系统的成功,C语言也逐渐流行起来,并成为了系统级编程和嵌入式开发的首选语言之一。
在C语言的发展过程中,经历了多个版本的标准化过程。1989年,美国国家标准研究所(ANSI)为C语言制定了一套ANSI标准,这一标准随后被国际化标准组织(ISO)采纳为ISO C标准(ISO 9899)。
C语言常用运算符表格
运算符类别 | 运算符 | 用法 | 含义 |
---|---|---|---|
算术运算符 | + |
5 + 3 结果为 8 |
加法运算 |
算术运算符 | - |
5 - 3 结果为 2 |
减法运算 |
算术运算符 | * |
5 * 3 结果为 15 |
乘法运算 |
算术运算符 | / |
5 / 3 结果为 1 (整数除法) |
除法运算 |
算术运算符 | % |
5 % 3 结果为 2 |
取模运算(余数) |
算术运算符 | ++ |
i++ 或 ++i |
自增运算(i 的值增加 1 ) |
算术运算符 | -- |
i-- 或 --i |
自减运算(i 的值减少 1 ) |
关系运算符 | == |
5 == 3 结果为 0 (假) |
等于 |
关系运算符 | != |
5 != 3 结果为 1 (真) |
不等于 |
关系运算符 | > |
5 > 3 结果为 1 (真) |
大于 |
关系运算符 | < |
5 < 3 结果为 0 (假) |
小于 |
关系运算符 | >= |
5 >= 3 结果为 1 (真) |
大于等于 |
关系运算符 | <= |
5 <= 3 结果为 0 (假) |
小于等于 |
逻辑运算符 | && |
1 && 0 结果为 0 (假) |
逻辑与 |
逻辑运算符 | || |
1 || 0 结果为 1(真) |
逻辑或 |
逻辑运算符 | ! |
!1 结果为 0 (假) |
逻辑非 |
位运算符 | & |
5 & 3 结果为 1 |
按位与 |
位运算符 | | |
5 | 3 结果为 7 |
按位或 |
位运算符 | ^ |
5 ^ 3 结果为 6 |
按位异或 |
位运算符 | ~ |
~5 结果依赖于系统和整数的位数 |
按位取反 |
位运算符 | << |
5 << 2 结果为 20 |
左移 |
位运算符 | >> |
5 >> 2 结果为 1 |
右移 |
赋值运算符 | = |
a = 5 |
赋值运算,将5赋值给变量a |
赋值运算符 | += |
a += 3 等价于 a = a + 3 |
加后赋值,将变量a与3的和再赋值给a |
赋值运算符 | -= |
a -= 3 等价于 a = a - 3 |
减后赋值,将变量a与3的差再赋值给a |
赋值运算符 | *= |
a *= 3 等价于 a = a * 3 |
乘后赋值,将变量a与3的乘积再赋值给a |
赋值运算符 | /= |
a /= 3 等价于 a = a / 3 |
除后赋值,将变量a除以3的商再赋值给a |
赋值运算符 | %= |
a %= 3 等价于 a = a % 3 |
模后赋值,将变量a除以3的余数再赋值给a |
赋值运算符 | <<= |
a <<= 2 等价于 a = a << 2 |
左移后赋值,将变量a的二进制表示左移2位后再赋值给a |
赋值运算符 | >>= |
a >>= 2 等价于 a = a >> 2 |
右移后赋值,将变量a的二进制表示右移2位后再赋值给a |
赋值运算符 | &= |
a &= 3 等价于 a = a & 3 |
按位与后赋值,将变量a与3的按位与结果再赋值给a |
赋值运算符 | ^= |
a ^= 3 等价于 a = a ^ 3 |
按位异或后赋值,将变量a与3的按位异或结果再赋值给a |
赋值运算符 | |= |
a |= 3 等价于 a = a | 3 |
按位或后赋值,将变量a与3的按位或结果再赋值给a |
条件运算符 | ? : |
x > 0 ? x : -x |
条件表达式,如果x大于0,结果为x,否则为-x |
逗号运算符 | , |
a = 5, b = 3 |
逗号运算符,用于分隔表达式 |
指针运算符 | * |
*ptr |
指针解引用,访问指针 ptr 指向的值 |
指针运算符 | & |
&var |
取地址,获取变量 var 的地址 |
其他运算符 | sizeof |
sizeof(int) |
计算对象或类型所占空间大小 |
其他运算符 | () |
(a + b) * c |
括号运算符,用于改变运算顺序 |
C语言常用表达式和语句表格
类别 | 表达式/语句 | 用法 | 含义 |
---|---|---|---|
算术表达式 | a + b |
int sum = a + b; |
计算两个变量的和 |
算术表达式 | a - b |
int difference = a - b; |
计算两个变量的差 |
算术表达式 | a * b |
int product = a * b; |
计算两个变量的乘积 |
算术表达式 | a / b |
int quotient = a / b; |
计算两个变量的商(整数除法) |
算术表达式 | a % b |
int remainder = a % b; |
计算两个变量的余数 |
赋值语句 | a = b |
a = 5; |
将b的值赋给a |
赋值语句 | a += b |
a += 3; |
将a与b的和赋给a |
赋值语句 | a -= b |
a -= 3; |
将a与b的差赋给a |
赋值语句 | a *= b |
a *= 3; |
将a与b的乘积赋给a |
赋值语句 | a /= b |
a /= 3; |
将a除以b的商赋给a |
赋值语句 | a %= b |
a %= 3; |
将a除以b的余数赋给a |
关系表达式 | a == b |
if (a == b) |
检查a是否等于b |
关系表达式 | a != b |
if (a != b) |
检查a是否不等于b |
关系表达式 | a > b |
if (a > b) |
检查a是否大于b |
关系表达式 | a < b |
if (a < b) |
检查a是否小于b |
关系表达式 | a >= b |
if (a >= b) |
检查a是否大于等于b |
关系表达式 | a <= b |
if (a <= b) |
检查a是否小于等于b |
逻辑表达式 | a && b |
if (a && b) |
检查a和b是否都为真 |
逻辑表达式 | a || b |
if (a || b) |
检查a或b是否至少有一个为真 |
逻辑表达式 | !a |
if (!a) |
检查a是否为假 |
条件语句 | if |
if (condition) { ... } |
如果条件为真,则执行语句块 |
条件语句 | else |
if (condition) { ... } else { ... } |
如果条件为假,则执行另一个语句块 |
条件语句 | else if |
if (condition1) { ... } else if (condition2) { ... } |
检查多个条件,并执行相应的语句块 |
循环语句 | while |
while (condition) { ... } |
当条件为真时,重复执行语句块 |
循环语句 | do...while |
do { ... } while (condition); |
至少执行一次语句块,然后当条件为真时重复执行 |
循环语句 | for |
for (initialization; condition; increment) { ... } |
根据初始化、条件和增量来重复执行语句块 |
分支语句 | switch |
switch (expression) { case value1: ...; break; ... } |
根据表达式的值选择执行相应的语句块 |
分支语句 | case |
在switch 语句中使用 |
指定一个要匹配的值 |
分支语句 | break |
在switch 或循环语句中使用 |
退出switch 语句或循环 |
分支语句 | default |
在switch 语句中使用 |
当没有匹配的值时执行的语句块 |
使用运算符和表达式制作一个简易小计算器
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <signal.h>
#include <stdbool.h>
volatile sig_atomic_t done = 0;
void intHandler(int dummy) {
done = 1;
}
int main() {
char operator[10];
double firstNumber, secondNumber;
signal(SIGINT, intHandler);
while (!done) {
printf(" _____ ____ _____ _____ _____ _____ _____ _____ \n");
printf(" ___|\\ \\ ____|\\ \\ |\\ \\ / /| ___|\\ \\ ____|\\ \\ |\\ \\ / /|\n");
printf(" / /\\ \\ / /\\ \\ | \\ \\ / / | | |\\ \\ / /\\ \\ | \\ \\ / / |\n");
printf("| | |____| | | | || \\____\\/ / /| | | |/ / \\ \\| \\____\\/ / /\n");
printf("| | ____ | |__| | \\ | / / / | | /_ _ /| | | |\\ | / / / \n");
printf("| | | || .--. | \\|___/ / / | |\\ \\ | | | | \\|___/ / / \n");
printf("| | |_, || | | | / / / | | | ||\\ \\ / /| / / / \n");
printf("|\\ ___\\___/ /||____| |____| /____/ / |____|/____/|| \\_____\\/____/ | /____/ / \n");
printf("| | /____ / || | | | |` | / | / || \\ | || | / |` | / \n");
printf(" \\|___| | / |____| |____| |_____|/ |____|_____|/ \\|____||____|/ |_____|/ \n");
printf(" \\( |____|/ \\( )/ )/ \\( )/ \\( )/ )/ \n");
printf(" ' )/ ' ' ' ' ' ' ' ' \n");
printf(" ' \n");
printf("欢迎使用GayBoy计算器\n");
printf("请输入运算符 (+, -, *, /, ^, sqrt, sin, cos, tan, 或输入 'exit' 退出): ");
scanf("%s", operator);
// 检查是否为退出命令
if (strcmp(operator, "exit") == 0) {
done = 1;
continue;
}
if (strcmp(operator, "sqrt") == 0 || strcmp(operator, "sin") == 0 || strcmp(operator, "cos") == 0 || strcmp(operator, "tan") == 0) {
printf("输入一个数字:");
scanf("%lf", &firstNumber);
} else {
printf("输入两个数字(用空格分开):");
scanf("%lf %lf", &firstNumber, &secondNumber);
}
if (strcmp(operator, "+") == 0) {
printf("%.1lf + %.1lf = %.1lf\n", firstNumber, secondNumber, firstNumber + secondNumber);
} else if (strcmp(operator, "-") == 0) {
printf("%.1lf - %.1lf = %.1lf\n", firstNumber, secondNumber, firstNumber - secondNumber);
} else if (strcmp(operator, "*") == 0) {
printf("%.1lf * %.1lf = %.1lf\n", firstNumber, secondNumber, firstNumber * secondNumber);
} else if (strcmp(operator, "/") == 0) {
if (secondNumber != 0.0)
printf("%.1lf / %.1lf = %.1lf\n", firstNumber, secondNumber, firstNumber / secondNumber);
else
printf("除数为0,无法进行除法运算。\n");
} else if (strcmp(operator, "^") == 0) {
printf("%.1lf ^ %.1lf = %.1lf\n", firstNumber, secondNumber, pow(firstNumber, secondNumber));
} else if (strcmp(operator, "sqrt") == 0) {
printf("sqrt(%.1lf) = %.1lf\n", firstNumber, sqrt(firstNumber));
} else if (strcmp(operator, "sin") == 0) {
printf("sin(%.1lf) = %.1lf\n", firstNumber, sin(firstNumber));
} else if (strcmp(operator, "cos") == 0) {
printf("cos(%.1lf) = %.1lf\n", firstNumber, cos(firstNumber));
} else if (strcmp(operator, "tan") == 0) {
printf("tan(%.1lf) = %.1lf\n", firstNumber, tan(firstNumber));
} else {
printf("错误!运算符不正确\n");
}
}
printf("程序已退出。\n");
return 0;
}
运行效果如下