例如,考虑一下:
int sum(int a, int b)
{
return a + b;
}
Run Code Online (Sandbox Code Playgroud)
与
int sum(const int a, const int b)
{
return a + b;
}
Run Code Online (Sandbox Code Playgroud)
第二种方法通常更快吗?
C中的函数参数被复制并发送到函数,因此函数内部的更改不会影响原始值.我的理由是,在sum上面的第二个中,编译器确实知道a并且b没有在函数内部进行修改,所以它只能传递原始值而不先复制它们.这就是为什么我认为第二个sum比第一个更快.但我真的不知道.在sum上面特别简单的例子中,差异(如果有的话)应该是最小的.
编辑:这个sum例子只是为了说明我的观点.我不希望在这个特定的例子中应该有很大的差异.但我想知道在更复杂的情况下const,编译器是否可以利用函数参数中的修饰符来使函数更快.我怀疑编译器总能确定一个参数是否在一个函数内被改变(因此我的第二个问题在下面); 因此我希望当它找到一个const修饰符时,它会做出与没有const修饰符时不同的东西.
问题:一般来说,一个函数在它的参数时会const比它们不是时更快?
问题2:通常,C编译器(理论上)是否总能确定函数内是否更改了函数参数?
假设我在整个程序中经常使用一些字符串(用于存储状态和类似的东西).字符串操作可能很昂贵,所以无论何时解决它们我都想使用枚举.到目前为止,我已经看到了几个解决方案:
typedef enum {
STRING_HELLO = 0,
STRING_WORLD
} string_enum_type;
// Must be in sync with string_enum_type
const char *string_enumerations[] = {
"Hello",
"World"
}
Run Code Online (Sandbox Code Playgroud)
我经常遇到的另一个:
typedef enum {
STRING_HELLO,
STRING_WORLD
} string_enum_type;
const char *string_enumerations[] = {
[STRING_HELLO] = "Hello",
[STRING_WORLD] = "World"
}
Run Code Online (Sandbox Code Playgroud)
这两种方法的缺点是什么?还有更好的吗?
我在使用了GO中的strings.Builder类型时遇到了问题.
尝试逐字运行示例代码,GO仍然响应:
undefined:strings.Builder
有关问题的任何线索,根本没有其他问题.
package main
import (
"fmt"
"strings"
)
func main() {
var b strings.Builder
for i := 3; i >=1; i-- {
fmt.Fprintf(&b, "%x...", i)
}
b.WriteString("ignition")
fmt.Println(b.String())
}
Run Code Online (Sandbox Code Playgroud) 我正在阅读关于malloc(first-fit)实现的脚本,我对元数据结构的值赋值有点困惑.任何人都可以给出一些解释为什么malloc返回flag_block->ptr(作为指向已分配内存的指针)?据我所知,没有具体的任务.
typedef struct _metadata {
size_t size;
char free;
struct _metadata* next;
struct _metadata* prev;
char ptr[];
} metadata;
metadata* flag_block = NULL;
void *malloc(size_t size)
{
if (size==0) {
return NULL;
}
if (flag_block == NULL) {
flag_block = sbrk(size);
sbrk(sizeof(metadata));
if (flag_block == (void *)-1) {
return NULL;
}
flag_block->free = 0;
flag_block->next=NULL;
flag_block->prev=NULL;
flag_block->size = size;
return flag_block->ptr;
} else {
/*
....
*/
}
}
Run Code Online (Sandbox Code Playgroud) 我正在学习C,如果这个问题看似简单或新手,那么你就知道为什么了.
阅读手册页的printf的我发现\ C列为转义序列.它的描述是
不产生进一步的产出
在此之前我从未见过和听说过\ c.所以我决定在一个简单的hello world程序中试一试:
printf("\nHello World\n\n\c");
Run Code Online (Sandbox Code Playgroud)
结果,gcc给了我这个警告:
警告:未知转义序列:'\ c'[默认启用]
这对我来说听起来很奇怪,所以我进一步调查了:我去了维基百科并且\ c没有被列为转义序列...因此我尝试在网上搜索,并在堆栈溢出.我发现很少提及\ C(实际上是两个)在讨论这个话题和这一个(我认为后者没有真正涉及到C,但似乎大家都在谈论"同一\ C ",阅读给出的描述).有人可以帮我理解这件事吗?
以下哪种方法是更正确的初始化变量的方法?
int x = 0;
int x = NULL;
Run Code Online (Sandbox Code Playgroud)
指针怎么样?我被告知不和谐的事情NULL,比如:" NULL最好初始化指针"或"不要使用NULL但是0来初始化变量"等等......现在,我在互联网上读到的NULL等于0和我测试了我自己.那有什么意义呢?为什么有些人说使用NULL不是一个好选择?有什么东西我不见了吗?
我正在重构一些代码并将我的类组件转换为函数组件,以此作为学习如何使用 Hooks 和 Effects 的一种方式。我的代码使用 Redux 进行状态管理,使用 axios 进行数据库请求,使用 Thunk 作为中间件处理异步性。我在一个组件中遇到问题,该组件执行 get 请求以检索过去的客户列表componentDidMount。无论我尝试什么,该useEffect函数都会进入无限循环并继续请求客户列表。
有问题的组件CustomersTable从数据库中获取客户列表并将其显示在表格中。该组件由容器组件包装,该组件使用 Redux 的连接将检索到的客户列表CustomersTable作为道具传递给。
useEffect(() => {
loadCustomers(currentPage, itemsPerPage, sortProp, (ascending ? 'asc' : 'desc'), {});
}, []);
Run Code Online (Sandbox Code Playgroud)
loadCustomers 是一个 Redux 操作,它使用 axios 来获取客户列表。currentPage、itemsPerPage、sortProp 和升序是初始化为“组件安装”上特定值的状态变量
我希望这是因为我使用空数组,它只会运行一次。相反,它会持续运行。我不明白为什么会这样。我最好的猜测是,当 redux 获取列表时,它返回一个新的 state 对象,因此 props 每次都会改变,然后触发重新渲染,然后获取一个新列表。我使用这个错误是因为 Redux 不打算与这样的钩子一起使用吗?
我最终通过添加以下内容来完成这项工作:
useEffect(() => {
if (!list.length) {
loadCustomers(currentPage, itemsPerPage, sortProp, (ascending ? 'asc' : 'desc'), {});
}
}, []);
Run Code Online (Sandbox Code Playgroud)
我不确定这是我真正想要的行为。如果客户列表确实为 0,则代码将继续获取列表。如果列表真的是空的,那么我希望它只获取一次然后停止。编辑:事实证明这绝对行不通。它适用于初始加载,但会破坏任何删除或编辑的代码。
好的,在此处提供更多上下文。包装客户表的容器组件是:
import { connect } …Run Code Online (Sandbox Code Playgroud) 我只是一名年轻的计算机科学学生,目前我对从stdin读取字符串的最佳实践有点困惑。我知道有很多方法可以做到这一点,有些方法比其他方法更安全,等等...我目前需要一个函数来防止缓冲区溢出并在末尾附加一个空终止符(\0)字符串的。我发现fgets对此非常有用,但是......它会停止读取 \n 或 EOF!如果我希望用户一次输入多行怎么办?还有其他功能可以帮助我做到这一点吗?如果这个问题对你们中的一些人来说似乎很愚蠢,我很抱歉,但是请理解我!任何帮助,将不胜感激。
我一直在研究c ++,我遇到了一个我不理解的隐式转换问题.在这段代码中:
#include <iostream>
using namespace std;
int main(){
int i;
i = 1 / 2 * 2 / 1. * 2. / 4 * 4;
cout << i << endl;
i = 3.5 + 2 + 1.6;
cout << i << endl;
i = 2 + 3.5 + 1.6;
cout << i << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它的输出分别为:0,7和7.
在最后两个示例中,编译器隐式地将元素转换为双精度数,因此sum = 7.1,然后将其转换为int以获得7.
因为第一个例子也有双打,我希望所有这些元素也被转换为双精度,并且总和为2.0,然后被强制转换为2,但结果为0,所以看起来似乎是"1/2" "被视为整数,给出结果为0.我不确定这是编译器正在做什么,但这就是它的样子.
我认为如果任何元素是double,编译器会隐式地将所有元素转换为double.但是在第一种情况下不会发生这种情况.有人可以解释为什么编译器会以不同方式转换它们 谢谢.
我试图在C中通过引用传递结构,以便我可以修改函数内的值.这是我到目前为止的代码,但它会产生一些警告和一个错误.
main.c中
#include <stdio.h>
#include "myfunctions.h"
#include "structures.h"
int main(int argc, char const *argv[] {
struct MyStruct data;
data.value = 6;
printf("Before change: %d\n", data.value);
changeData(data);
printf("After change: %d\n", data.value);
}
Run Code Online (Sandbox Code Playgroud)
myfunctions.c
#include "structures.h"
void changeData(MyStruct data) {
data.value = 7;
}
Run Code Online (Sandbox Code Playgroud)
myfunctions.h
#ifndef MyStruct
#define MyStruct
void changeData(MyStruct data);
#endif
Run Code Online (Sandbox Code Playgroud)
structures.h
typedef struct {
int value;
} MyStruct;
Run Code Online (Sandbox Code Playgroud)
产生的错误
In file included from main.c:2:0:
myfunctions.h:4:1: warning: parameter names (without types) in function declaration
void changeData(MyStruct data);
^
In file …Run Code Online (Sandbox Code Playgroud) 每当我尝试运行此C程序时,我都会收到分段错误(核心转储)消息.
#include <stdio.h>
int main()
{
int i = 200, *p, *q, *r;
p,r = &i;
q = p;
*q = *p + 1;
printf("*p = %d\n", *p);
printf("*r = %d\n", *r);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它没有任何r的第一秒,但我不得不添加rS作为一个别名i,然后打印语句添加到输出的提领值q和r.
这是一个函数,我用来释放动态分配的内存
void Free(void* arg) {
if(arg!=NULL) {
free(arg);
arg=NULL;
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止它工作正常,直到我开始使用pthreads.我的堆栈有时会被粉碎,我唯一能做的就是使用pthread_mutex_lock()
是否有任何原子公告来检查和释放gcc中的内存?
或者您可以提出另一种解决方案?我希望互斥体不是唯一的方法