printf("%d,%d",b++,++b); 对于printf的一些理解,以及前++后++

首先先说下原理:

1 printf函数对于括号内的表达式是从右向左执行,如 printf("%d,%d",b++,++b);先执行 ++b,再执行b++;

2对于++a和a++:

++a是先自加,再调用

a++是先调用,再自加

下面来分析下

代码如下

int b=20;

printf("%d,%d",b++,++b);// 21 22
printf("%d,%d",b++,b++); //21  20
printf("%d,%d",++b,++b); //22  22

printf("%d,%d",++b,b++); //22  20

首先 第一句(printf("%d,%d",b++,++b);// 21 22就这句)

先执行++b,之后b=21,再执行b++,因为b++是先先调用,在自加,所以先输出b,此时b的值是21,再自加,b=22,此时再输出b,因此输出的结果是21,22

第二句 (printf("%d,%d",b++,b++); //21  20)

先执行b++(第二个b++),因为b++是先调用,后++,所以cpu会记住d的这个printf输出的第二个输出对它的调用(此处第二个输出的值已经确定了)(这儿可能有点难理解,可以这样想,系统缓存了一个b的输出,只是还没输出而已,相当于在此处第二个输出的值就已经确定了,就是b当前的值,即20),之后再执行b++(第一个b++),b还没加的时候是21(执行前面b++得到的结果),同样,b++是先调用,再执行,因此就输出了21,第二个输出20是前面系统对它算是记忆吧,因此输出20,如果在这句后面加上printf("%d",b);的话,这句输出的b的值是22

第三句一样的道理, 先执行++b,因为++b先自加,再调用,而此时cpu并没有到调用它的时候,printf第二个格式化的值对应的数字现在还不确定,在然后执行++b,同样先自加,再调用,输出22,接着再输出第二个,因为cpu没有记住对第二的调用,他会找当前b的值,当前b的值是22,所以输出22,22

最后一句,一样的道理,这儿我就不分析了。

  • 14
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
当然,以下是一个基于C语言的B+树算法的简单实现。尽管它可能不是非常复杂,但可以帮助您理解B+树的基本原理和实现方法。 ```c #include <stdio.h> #include <stdlib.h> // B+树的节点结构 typedef struct BPlusTreeNode { int *keys; // 关键字数组 struct BPlusTreeNode **child; // 子节点指针数组 int keyNum; // 节点中关键字的数量 int isLeaf; // 是否为叶子节点 struct BPlusTreeNode *next; // 指向下一个叶子节点的指针 } BPlusTreeNode; // 创建一个B+树节点 BPlusTreeNode* createNode(int isLeaf) { BPlusTreeNode *newNode = (BPlusTreeNode*)malloc(sizeof(BPlusTreeNode)); newNode->keys = (int*)malloc(sizeof(int) * (2 * t - 1)); newNode->child = (BPlusTreeNode**)malloc(sizeof(BPlusTreeNode*) * (2 * t)); newNode->keyNum = 0; newNode->isLeaf = isLeaf; newNode->next = NULL; return newNode; } // 初始化一个B+树 void initBPlusTree() { root = createNode(1); root->next = NULL; } // 在B+树中查找关键字 BPlusTreeNode* search(int key) { BPlusTreeNode *node = root; while (node) { int i = 0; while (i < node->keyNum && key > node->keys[i]) { i++; } if (i < node->keyNum && key == node->keys[i]) { return node; } if (node->isLeaf) { return NULL; } node = node->child[i]; } return NULL; } // 分裂节点 void splitChild(BPlusTreeNode *parentNode, int i, BPlusTreeNode *childNode) { BPlusTreeNode *newNode = createNode(childNode->isLeaf); newNode->keyNum = t - 1; for (int j = 0; j < t - 1; j++) { newNode->keys[j] = childNode->keys[j + t]; } if (!childNode->isLeaf) { for (int j = 0; j < t; j++) { newNode->child[j] = childNode->child[j + t]; } } childNode->keyNum = t - 1; for (int j = parentNode->keyNum; j > i; j--) { parentNode->child[j + 1] = parentNode->child[j]; } parentNode->child[i + 1] = newNode; for (int j = parentNode->keyNum - 1; j >= i; j--) { parentNode->keys[j + 1] = parentNode->keys[j]; } parentNode->keys[i] = childNode->keys[t - 1]; parentNode->keyNum++; } // 插入关键字 void insertKey(BPlusTreeNode *node, int key) { int i = node->keyNum - 1; if (node->isLeaf) { while (i >= 0 && key < node->keys[i]) { node->keys[i + 1] = node->keys[i]; i--; } node->keys[i + 1] = key; node->keyNum++; } else { while (i >= 0 && key < node->keys[i]) { i--; } i++; if (node->child[i]->keyNum == 2 * t - 1) { splitChild(node, i, node->child[i]); if (key > node->keys[i]) { i++; } } insertKey(node->child[i], key); } } // 插入关键字到B+树中 void insert(int key) { BPlusTreeNode *node = root; if (node->keyNum == 2 * t - 1) { BPlusTreeNode *newNode = createNode(0); root = newNode; newNode->child[0] = node; splitChild(newNode, 0, node); insertKey(newNode, key); } else { insertKey(node, key); } } // 打印B+树 void printBPlusTree(BPlusTreeNode *node) { if (node) { for (int i = 0; i < node->keyNum; i++) { printf("%d ", node->keys[i]); } printf("\n"); if (!node->isLeaf) { for (int i = 0; i < node->keyNum + 1; i++) { printBPlusTree(node->child[i]); } } } } int main() { initBPlusTree(); insert(10); insert(20); insert(30); insert(40); insert(50); insert(60); insert(70); insert(80); printBPlusTree(root); return 0; } ``` 这是一个简单的B+树的实现,其中包括节点的创建、查找、分裂和插入等基本操作。请注意,为了尽可能保持简单,我省略了一些错误处理和其他辅助函数。实际的B+树实现可能需要更多的功能和优化。如果需要更复杂的实现,您可以参考更完整的B+树实现或使用现有的B+树库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值