Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C函数通常比OOP语言的方法有更多的参数吗?

C函数通常比OOP语言的方法有更多的参数吗?
EN

Stack Overflow用户
提问于 2020-06-16 12:08:51
回答 3查看 233关注 0票数 2

我不得不编写一个C程序,它有600多行代码和大约25个函数。这是我编写的最长的C代码。

我注意到其中一些函数有5个以上的参数。直接从main()调用的对象有更多的参数。它离main()越远,就越少。

我还注意到,我经常不得不将参数传递给函数,并不是因为该函数直接使用该参数,而是该函数调用了另一个需要该参数的函数。

所以看起来就像

代码语言:javascript
运行
AI代码解释
复制
void f1(int a, int b,..., int bar){
    int foo = f2(bar); // the only time 'bar' is used in f1
    .
    .
    .
}

我试图最小化全局变量的使用,但我不得不声明一些全局变量,因为有些参数变得过于冗余。基本上,我必须把这些论点传递给每个函数。

我不是一个经验丰富的程序员,但当我用Java编程时,我认为我从来不需要用5个以上的参数来编写一个方法。

在C语言中传递比其他语言更多的参数是正常的吗?这仅仅是过程编程与面向对象编程的本质吗?还是我只是在写坏的C代码?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-16 12:46:03

您对避免太多全局变量的担忧是正确的,因为有了它们,程序往往变得不可维护,特别是当它们越来越大时。让我们通过参数将数据传递给函数。

由于许多原因,使用参数为函数提供执行所需的信息是一个好主意。它首先提供了代码的可读性,但也使编写线程安全函数(可以从不同线程安全调用的函数)变得更加容易。

总之,通常情况下,使用定义一个函数--有时-在堆栈消耗方面,确实会导致效率低下(特别是在嵌入式系统中,只有前3或4个参数使用处理器寄存器,所有其他参数都复制到堆栈中)。

解决方案是使用数据结构。使用struct(与OOP语言(如Java )中调用对象的不同之处),您可以在逻辑实体中对全局数据进行分组。这使您可以在一起定义所有数据,更改其字段,并将其传递给您的函数。通过指针将其传递给,使在其原始位置修改它成为可能。

因此,您的示例函数将成为

代码语言:javascript
运行
AI代码解释
复制
typedef struct
{
    int a;
    int b;
    int bar;
} MyData_t;

void f1( MyData_t *data )
{
    int foo = f2( data->bar );

    /* ... */
}

int main( void )
{
    MyData_t d = { 5, 7, 9 };

    f1( &d );

    return 0;
}

您需要更改f2(),传递更多参数吗?那么,将指向MyData_t的指针转发到它,您将访问所需的所有变量。

最后,回答您的问题,统计分析可能会减少在OOP语言中传递的参数,而不是过程语言:仅仅因为在大多数语言中,调用对象将是过程语言中的一个参数。但是,如果有了精心设计的结构化编程,这种差异就会非常小。

票数 5
EN

Stack Overflow用户

发布于 2020-06-16 13:48:17

在C语言中传递的参数比其他语言多吗?这仅仅是过程编程与面向对象编程的本质吗?还是我只是在写坏的C代码?

这是很普通的事。这是因为在C中,我们没有对象(是的,我们有,但它与Java人所称的对象完全不同),而只是变量(C中的对象)。

因此,您将类的等效值传递给C函数,只需将该类中的每个属性传递给该函数。对矩阵进行反向转换的函数将具有以下签名:

代码语言:javascript
运行
AI代码解释
复制
void inverse (const double *input, size_t ix, size iy, 
              double *output, size_t ox, size_t oy);

在Java或C++中,它看起来如下所示:

代码语言:javascript
运行
AI代码解释
复制
void inverse(const Matrix &input, Matrix &output);

(我不是一个好的C++程序员,所以请原谅我的错误)

关键是Matrix对象包含它们内部的维度成员变量。在面向对象语言中被反对的是数据类型,它是没有方法和公共成员变量的类。

在C中有一个等价的,那就是一个结构。不支持成员函数,除非您使用函数指针(您可以在C中执行OOP,但它非常混乱)。结构基本上是一个没有封装和对私有成员的支持的类。所以它们符合目的。

与数组不同,您不必将它们作为指针传递。这很好:

代码语言:javascript
运行
AI代码解释
复制
struct myStruct {
    int a;
    char b;
    double c[2];
    void **;
};

bool intIsFortyTwo(struct myStruct args) {
    return args.a == 42;
}

还可以返回结构:

代码语言:javascript
运行
AI代码解释
复制
struct myStruct initStruct() {
    struct myStruct ret = {.a=22, .b='a'};
    return ret;
}

一般来说,出于性能原因,指针是可取的。如果不使用指针,则将创建整个结构副本。第一个函数可以是

代码语言:javascript
运行
AI代码解释
复制
bool intIsFortyTwo(struct myStruct *args) {
    return args->a == 42;
}

将结构传递给函数并不是非常常见,但也不奇怪。用它你会发现它很有用。

票数 3
EN

Stack Overflow用户

发布于 2020-06-16 12:46:34

为了扩展注释中的观点,在替代方法是大量单个参数时,将单个指针传递给struct的效率得到了提高,因为与传递多个指针或代表单个参数的值相比,传递单个指针(只要它小于1023)的sizeof很小。与多于3或4个参数的任何参数相比,读一个参数也容易得多。

因此,即使使用一个相对较小的原型示例:void f1(int a, int b, int bar) (删除了省略号)。给定32位目标,具有4字节/int

代码语言:javascript
运行
AI代码解释
复制
sizeof a + sizeof b + sizeof bar == 12bytes

与指向具有超过1000个成员的结构的指针的大小相比

代码语言:javascript
运行
AI代码解释
复制
typedef struct {
    int a;
    int b;
    ... say 1000 more ints
    int bar;
}data_t;

data_t *pData 
pData = &data_t;//point pointer back to location t_data.

sizeof pData == 8 bytes
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62416770

复制
相关文章
jQuery限制复选框checkbox的选中次数
<div class="one"> <input type="checkbox" name="checkbox" value="A"> </div> <div class="two"> <input type="checkbox" name="checkbox" value="B"> </div> <div class="three"> <input type="checkbox" name="
明知山
2020/09/03
2.4K0
动态生成表格、隐藏表格、选中删除任意行、jquery、输入验证
我建两个相似的表是为了,给后台使用人员显示所操作的数据,同时方便把开发人员真正要操作的数据传到对应Action中,隐藏开发人员传参用的表。
微风-- 轻许--
2022/04/13
2.8K0
动态生成表格、隐藏表格、选中删除任意行、jquery、输入验证
使用 jQuery 统计用户选中的复选框的个数
微信公众号平台每个用户最多可以设置三个标签,所以在管理员给用户设置标签的时候需要统计用户的标签,下面就是使用使用 jQuery 统计用户选中的复选框的个数的方法:
Denis
2023/04/15
1.5K0
input checkbox复选框点击获取当前选中状态jquery
function checkAll(id) { //用is判断 // let checkStatus=$(id).is(':checked'); // console.log(checkStatus) //用prop方法(用attr获取不到) let checkStatus=$(id).prop("checked"); console.log(checkStatus) } html: <input type="checkbox" value="" id=
蓓蕾心晴
2018/07/06
2.5K0
jquery循环获取所有复选框,包括选中的,未选中的「建议收藏」
此处小编的是freemarker代码,不过html代码一样的,有了复选框后,要保证每个复选框的name是一致的。这样下面才能遍历
全栈程序员站长
2022/08/05
3.1K0
checkbox选中和不选中 jqu_jquery checkbox 选中不选中
jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。jQuery设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。
全栈程序员站长
2022/09/07
3K0
PyQt5 技巧篇-复选框绑定行内容,全选、清空、展示选中的内容功能实现演示,设置复选框选中,检查复选框选中状态
我设置两个有序序列,分别存储对应的复选框和行内容。 我的行内容是用的label标签。
小蓝枣
2020/09/22
3.7K0
PyQt5 技巧篇-复选框绑定行内容,全选、清空、展示选中的内容功能实现演示,设置复选框选中,检查复选框选中状态
jquery.validate添加只能输入英文的验证
代码如下: // 只能输入英文 jQuery.validator.addMethod("english", function(value, element) { var chrnum = /^([a-zA-Z]+)$/; return this.optional(element) || (chrnum.test(value)); }, "只能输入字母");
飞奔去旅行
2019/06/13
2.1K0
jquery获取checkbox是否选中
在使用jquery的过程中,发现了一个比较特别的属性,那就是 input标签的 checkbox的 是否选中状态
执笔记忆的空白
2020/12/25
2.9K0
html复选框选中与未选中触发事件的方法
今天,当制作一个不需要from表单的复选框来提交数据的小函数时,需要在复选框被选中或未选中的情况下修改一些后台数据。我想到了用js代码来监控复选框的状态,并将实时数据发送到后台。关于js代码如何监控checkbox的状态,可以参考下面的例子。
Power
2023/05/25
5.2K0
html复选框选中与未选中触发事件的方法
jQuery对输入框进行验证,只允许输入字母和数字
使用jQuery来对这两个输入框进行验证,确保只允许输入字母和数字,不允许输入中文字符。 以下是相应的示例代码:
王小婷
2023/09/19
4330
React技巧之检查复选框是否选中
原文链接:https://bobbyhadz.com/blog/react-check-if-checkbox-is-checked[1]
chuckQu
2022/08/19
1.5K0
React技巧之检查复选框是否选中
Jquery 判断 checked 是否选中
如果要判断Js中的 checked 是否选中,首先取决于你 引用 的 Jquery 的版本。
White feathe
2021/12/08
2.8K0
jquery关于checkbox选中和不选中的问题
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/148481.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/07
2K0
jquery操作select(取值,设置选中)
本文由 小马哥 创作,采用 知识共享署名4.0 国际许可协议进行许可 本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
IT小马哥
2023/04/07
3.9K0
checkbox选中和不选中 jqu_jquery怎么设置checkbox不选中?
1、设置不选中:$(“#my-checkbox”).prop(“checked”,false);
全栈程序员站长
2022/09/14
3.8K0
用jquery实现表单验证_jquery验证插件
功能强大的 jQuery 表单验证插件,适用于日常的 E-mail、电话号码、网址等验证及 Ajax 验证,除自身拥有丰富的验证规则外,还可以添加自定义的验证规则。
全栈程序员站长
2022/11/09
4.5K0
jquery 选中某一行
jquery 选中某一行 html: <div class="chatBox-list" ref="chatBoxlist"> <div class="chat-list-people"> <div><img src="img/icon01.png" alt="头像"/></div> <div class="chat-name"> <p>小明</p>
Dream城堡
2018/09/10
1.3K0
jquery操作select(取值,设置选中)
每一次操作select的时候,总是要出来翻一下资料,不如自己总结一下,以后就翻这里了。
全栈程序员站长
2022/07/11
3.5K0
点击加载更多

相似问题

Javascript :如果选中复选框,则必须填充验证输入

12

仅选中jquery复选框

40

jQuery验证-选中复选框时检查输入值

10

仅当选中复选框时才使用jquery验证字段

21

Yup -选中仅验证1复选框

250
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档