C语言函数与标准变化全解析
立即解锁
发布时间: 2025-08-22 00:24:54 阅读量: 2 订阅数: 6 


C语言编程基础与实践
### C语言函数与标准变化全解析
#### 1. 数学函数
在C语言中,有一系列丰富的数学函数可供使用,这些函数能帮助我们完成各种复杂的数学计算。以下是一些常见数学函数的介绍:
| 函数名 | 功能 |
| ---- | ---- |
| `sin(x)` | 计算x的正弦值 |
| `cos(x)` | 计算x的余弦值 |
| `tan(x)` | 计算x的正切值 |
| `asin(x)` | 计算x的反正弦值,x范围为[-1,1],结果范围为[-π/2,π/2] |
| `acos(x)` | 计算x的反余弦值,x范围为[-1,1],结果范围为[0,π] |
| `atan(x)` | 计算x的反正切值,结果范围为[-π/2,π/2] |
| `atan2(y,x)` | 计算y/x的反正切值,结果范围为[-π,π] |
| `sinh(x)` | 计算x的双曲正弦值 |
| `cosh(x)` | 计算x的双曲余弦值 |
| `tanh(x)` | 计算x的双曲正切值 |
| `exp(x)` | 计算指数函数e^x |
| `log(x)` | 计算x的自然对数,x > 0 |
| `log10(x)` | 计算x以10为底的对数,x > 0 |
| `pow(x,y)` | 计算x的y次幂。若x = 0且y <= 0,或x < 0且y不是整数,会发生定义域错误 |
| `sqrt(x)` | 计算x的平方根,x >= 0 |
| `ceil(x)` | 返回不小于x的最小整数,以双精度浮点数形式返回 |
| `floor(x)` | 返回不大于x的最大整数,以双精度浮点数形式返回 |
| `fabs(x)` | 返回x的绝对值 |
| `ldexp(x,n)` | 计算x * 2^n |
| `frexp(x, int *ip)` | 将x分解为一个归一化分数(范围在[1/2,1))和2的幂,归一化分数作为返回值,2的幂存储在*ip中。若x为0,结果的两部分都为0 |
| `modf(x, double *ip)` | 将x分解为整数部分和小数部分,两部分与x符号相同。整数部分存储在*ip中,小数部分作为返回值 |
| `fmod(x,y)` | 计算x/y的浮点余数,符号与x相同。若y为0,结果由实现定义 |
#### 2. 实用函数(<stdlib.h>)
`<stdlib.h>`头文件声明了用于数字转换、存储分配等任务的函数。以下是这些函数的详细介绍:
- **数字转换函数**:
- `double atof(const char *s)`:将字符串s转换为双精度浮点数,等同于`strtod(s, (char**)NULL)`。
- `int atoi(const char *s)`:将字符串s转换为整数,等同于`(int)strtol(s, (char**)NULL, 10)`。
- `long atol(const char *s)`:将字符串s转换为长整数,等同于`strtol(s, (char**)NULL, 10)`。
- `double strtod(const char *s, char **endp)`:将s的前缀转换为双精度浮点数,忽略前导空格。若endp不为NULL,将未转换后缀的指针存储在*endp中。若结果溢出,返回带正确符号的HUGE_VAL;若结果下溢,返回0。两种情况都会将errno设置为ERANGE。
- `long strtol(const char *s, char **endp, int base)`:将s的前缀转换为长整数,忽略前导空格。若base在2到36之间,假设输入以该进制书写。若base为0,进制为8、10或16;前导0表示八进制,前导0x或0X表示十六进制。字母表示10到base - 1的数字;十六进制允许前导0x或0X。若结果溢出,根据结果符号返回LONG_MAX或LONG_MIN,并将errno设置为ERANGE。
- `unsigned long strtoul(const char *s, char **endp, int base)`:与`strtol`类似,只是结果为无符号长整数,错误值为ULONG_MAX。
- **随机数函数**:
- `int rand(void)`:返回一个范围在0到RAND_MAX(至少为32767)的伪随机整数。
- `void srand(unsigned int seed)`:使用seed作为新的伪随机数序列的种子,初始种子为1。
- **内存分配函数**:
- `void *calloc(size_t nobj, size_t size)`:返回一个指向nobj个对象数组的指针,每个对象大小为size。若请求无法满足,返回NULL。分配的空间初始化为零字节。
- `void *malloc(size_t size)`:返回一个指向大小为size的对象的指针。若请求无法满足,返回NULL。分配的空间未初始化。
- `void *realloc(void *p, size_t size)`:将p指向的对象大小更改为size。内容在新旧大小的最小值范围内保持不变。若新大小更大,新空间未初始化。返回指向新空间的指针,若请求无法满足,返回NULL,此时*p不变。
- `void free(void *p)`:释放p指向的空间。若p为NULL,不做任何操作。p必须是之前由`calloc`、`malloc`或`realloc`分配的空间的指针。
- **程序控制函数**:
- `void abort(void)`:导致程序异常终止,就像调用`raise(SIGABRT)`一样。
- `void exit(int status)`:导致程序正常终止。按注册的逆序调用`atexit`函数,刷新打开的文件,关闭打开的流,并将控制权返回给环境。状态如何返回给环境由实现定义,但零表示成功终止。也可以使用`EXIT_SUCCESS`和`EXIT_FAILURE`。
- `int atexit(void (*fcn)(void))`:注册函数fcn,在程序正常终止时调用。若注册失败,返回非零值。
- `int system(const char *s)`:将字符串s传递给环境执行。若s为NULL,若有命令处理器,返回非零值。若s不为NULL,返回值由实现定义。
- `char *getenv(const char *name)`:返回与name关联的环境字符串,若不存在,返回NULL。具体细节由实现定义。
- **搜索和排序函数**:
- `void *bsearch(const void *key, const void *base, size_t n, size_t size, int (*cmp)(const void *keyval, const void *datum))`:在`base[0]...base[n - 1]`中搜索与*key匹配的项。比较函数`cmp`在第一个参数(搜索键)小于第二个参数(表项)时返回负数,相等时返回零,大于时返回正数。数组`base`中的项必须按升序排列。若找到匹配项,返回指向该项的指针;否则返回NULL。
- `void qsort(void *base, size_t n, size_t size, int (*cmp)(const void *, const void *))`:将`base[0]...base[n - 1]`的对象数组按升序排序。比较函数`cmp`与`bsearch`中的相同。
- **其他函数**:
- `int abs(int n)`:返回整数n的绝对值。
- `long labs(long n)`:返回长整数n的绝对值。
- `div_t div(int num, int denom)`:计算`num/denom`的商和余数,结果存储在`div_t`类型结构的`quot`和`rem`成员中。
- `ldiv_t ldiv(long num, long denom)`:计算`num/denom`的商和余数,结果存储在`ldiv_t`类型结构的`quot`和`rem`成员中。
#### 3. 诊断函数(<assert.h>)
`assert`宏用于向程序添加诊断信息:
```c
void assert(int expression)
```
当执行`assert(expression)`时,如果`expression`为零,`assert`宏将在标准错误输出上打印一条消息,例如:
```
Assertion failed: expression, file filename, line nnn
```
然后调用`abort`终止执行。源文件名和行号来自预处理器宏`__FILE__`和`__LINE__`。如果在包含`<assert.h>`时定义了`NDEBUG`,`assert`宏将被忽略。
#### 4. 可变参数列表(<stdarg.h>)
`<stdarg.h>`头文件提供了遍历未知数量和类型的函数参数列表的功能。假设`lastarg`是具有可变数量参数的函数`f`的最后一个命名参数。在`f`中声明一个`va_list`类型的变量,它将依次指向每个参数:
```c
va_list ap;
```
在访问任何未命名参数
0
0
复制全文
相关推荐









