C语言
Albert52856
这个作者很懒,什么都没留下…
展开
-
与运算符和或运算符的语句执行顺序
与运算符和或运算符的语句执行顺序有一个老生常谈的问题,那就是与运算符和或运算符的语句执行顺序。express1 || express2先执行表达式express1如果为“真”,express2将不被执行,express2仅在express1为“假”时才被执行。因为第一个表达式为真了,整个表达式都为真,所以没有必要再去执行第二个表达式了。express1 && express2先执行表达式express1如果为“假”,express2将不被执行,express2仅在express原创 2021-11-26 10:46:11 · 1569 阅读 · 1 评论 -
函数的输入输出设计
函数的输入输出设计输入要保持开放,输出要保持保守。(Be liberal in what you accept, and conservative in what you send.)-- Jon Postel 谈如何设计接口我经常看到这样的程序:void FuncName(char* str){ int len = strlen(str); .....}char* GetUserName(struct user* pUser){ return pUser->原创 2021-11-26 10:42:23 · 210 阅读 · 0 评论 -
C语言学习笔记-结构体占用内存大小的计算
C语言学习笔记-结构体占用内存大小的计算引言例子计算方法结构体的内存计算方式遵循以下规则:有了这些规则,再来看上面的两个例子。如果手动设置`#pragma pack(4)`呢补充:C语言数据类型占内存大小引言结构体在C语言中虽然经常使用,但是怎么计算一个结构体占用多大的内存,很多C语言的新手都没注意过,其实C语言的语法简单,难就难在它更偏向于与底层,与内存打交道。对于嵌入式方面来说,对C语言的要求更高,因为有些硬件的内存并不像我们使用的电脑的内存那么充裕,所以需要节约内存。结构体中同样的变量个数,却可原创 2021-11-26 10:40:27 · 1316 阅读 · 0 评论 -
C语言学习笔记-宏定义的使用注意事项
在使用宏定义的时候有一些注意事项必须注意,要适当的使用圆括号以保证计算次序的正确性。比如:# define square(x) x * x当使用 square(x + 1) 调用该宏定义的时候会出现什么情况呢?请见下面例子:#include <stdio.h>#include <string.h>#include <stdlib.h># define square(x) (x * x)int main(void) { int i =原创 2021-09-01 13:55:09 · 382 阅读 · 0 评论 -
C语言学习笔记-有符号数和无符号数相加的问题
Q: 下面的代码输出是什么,为什么?void test(void){ unsigned int a = 6; int b = -10; ((a + b) > 0) ? printf("a + b > 0\r\n") : printf("a + b < 0\r\n"); printf("a + b = %d\r\n", a + b);}A:废话,输出是:a + b < 0a + b = -4但是,上机实际跑一跑,真的是这样的吗?原创 2021-09-01 13:51:25 · 1189 阅读 · 1 评论 -
栈为什么要由高地址向低地址扩展?
原因计算机内存分了代码段(.text段)、初始化的数据段(.data段)、未初始化的数据段(.bss段)、堆空间(heap)、栈空间(stack)和命令行参数和环境变量区域。程序计数器(Program Counter,简称PC)的缺省指向0地址,计算机开机后从程序计数器指向的地址开始执行程序,每执行完一条指令后, 程序计数器自动加1。因此很自然的,代码段从低地址区间开始加载,向高地址区间扩展;heap从低地址向高地址扩展,做内存管理相对要简单些,为了避免栈空间和代码段冲突,最大利用地址空间,很自然的原创 2021-08-21 10:24:15 · 4785 阅读 · 3 评论 -
C语言学习笔记: i < j < k 的操作
表达式i < j < k在C语言中是合法的,但是它不是你所期望的意思。因为<运算符是左结合的, 所以这个表达式等价于(i < j) < k.换句话说, 表达式首先检测l.是否小千j, 然后用比较后产生的结果1或0来和K进行比较。 表达式不测试j是否位于i和K之间,正确的表达式应该是i < j && j < k.#include <stdio.h>#include <stdlib.h>int m原创 2020-11-03 20:15:12 · 3090 阅读 · 4 评论 -
C语言学习笔记:break and continue
在循环体中,C 提供了下列的循环控制语句。breakcontinuegoto但是 goto 尽量不要使用。它会导致代码结构混乱。#include <stdio.h>#include <stdlib.h>int main(void){ int x = 5; int y = 5; while (x > 0) { printf("x为:%d\r\n", x); if (x <= 3)原创 2020-11-03 20:16:20 · 138 阅读 · 0 评论 -
C语言学习笔记-浮点数的使用注意事项
C语言学习笔记-浮点数的使用注意事项浮点数都是有符号的,没有 unsigned 浮点数Q:为什么没有无符号的浮点型,比如 unsigned float 或 unsigned double?A:为什么C++不支持无符号浮点数是因为CPU没有等效的机器代码操作来执行.因此支持它是非常低效的.所以问题就是为什么硬件实施者不支持它?我认为答案是最初没有定义无符号浮点标准。由于语言喜欢向后兼容,即使添加了语言也无法使用它。要查看浮点规范,您应该查看IEEE标准754浮点数。我肯定无符号浮点数是有用处的。原创 2021-08-20 22:11:23 · 489 阅读 · 0 评论