c - 函数调用的参数中可以使用后自增运算符吗?在 C?
问题描述
我的问题一般与函数调用有关,但我在使用堆编写优先级队列时想到了它。只是为了提供一些上下文(不是很重要),我的堆从上到下从左到右存储项目,我将堆表示为结构数组。在插入一个新项目时,我只是将它放在堆中的最后一个位置,然后调用底部的函数“fix_up”,这会将项目移动到堆中的正确位置。我想知道如果不是做...
fix_up(pQueue->heap, pQueue->size);
pQueue->size++;
……我只能……
fix_up(pQueue->heap, pQueue->size++);
由于几个原因,我不确定这是否可行。
1) 由于 pQueue->size 在函数调用中,我什至不确定它实际上是 pQueue->size 还是存储在 pQueue->size 中的整数的副本。如果它是一个副本,那么显然我不会将 1 添加到实际的 pQueue->size 中,所以这样做没有意义。
2) 因为它是一个函数调用,所以它将进入函数 fix_up 并执行那里的所有代码。我想知道这是否会产生意想不到的后果,即当它进入 fix_up 时,它会增加 1,并且我的索引会比我在执行 fix_up 时的预期高 1?或者它会做它应该做的事情并等到 fix_up 完成执行之后?
3)即使没问题,它是否被认为是 C 的良好编码实践?
Status priority_queue_insert(PRIORITY_QUEUE hQueue, int priority_level, int data_item)
{
Priority_queue *pQueue = (Priority_queue*)hQueue;
Item *temp_heap;
int i;
/*Resize if necessary*/
if (pQueue->size >= pQueue->capacity) {
temp_heap = (Item*)malloc(sizeof(Item) * pQueue->capacity * 2);
if (temp_heap == NULL)
return FAILURE;
for (i = 0; i < pQueue->size; i++)
temp_heap[i] = pQueue->heap[i];
pQueue->capacity *= 2;
}
/*Either resizing was not necessary or it successfully resized*/
pQueue->heap[pQueue->size].key = priority_level;
pQueue->heap[pQueue->size].data = data_item;
/*Now it is placed as the last item in the heap. Fixup as necessary*/
fix_up(pQueue->heap, pQueue->size);
pQueue->size++;
//continue writing function code here
}
解决方案
是的,您可以直接在作为参数传递的表达式中使用它。
像这样的声明
fix_up(pQueue->heap, pQueue->size++);
有点等价于
{
int old_value = pQueue->size;
pQueue->size = pQueue->size + 1;
fix_up(pQueue->heap, old_value);
}
关于上面“等效”示例的注释。由于未指定函数调用的参数评估顺序,实际的增量pQueue->size
可能发生在调用fix_up
. 这也意味着pQueue->size
在同一个调用中多次使用会导致未定义的行为。
推荐阅读
- excel - Excel - 如何组合两列的值(并非在所有情况下)
- c++ - 大 O 和 Theta for 循环
- oracle - 在数据库中导入文件时应该在表中发生更改
- javascript - React 应用程序必须在新部署后清除浏览器缓存
- svn - 忽略之前添加和删除的文件
- swift - SwiftUI - 删除导航返回按钮标题
- json - 在 Swift 4 中使用可编码的数组中的嵌套字典键值
- postgresql - 使用气流 helm2 图表获取 pod 具有未绑定的即时 PersistentVolumeClaims
- python-3.x - 根据条件删除特殊字符并替换为相关文本
- r - Compare multiple columns and create new ones in R