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;    
}
运行效果如下
 
 