在“for”循环初始化子句中声明多个变量

在“for”循环初始化子句中声明多个变量

介绍

如你所知,C 和 C++ 中 for 语句的语法是:

    for ( init-clause ; 条件表达式 ; 迭代表达式 )

地点:

init-clause 用于初始化(准备)循环的开始;condition-expr 在每次迭代之前进行评估:如果为零,则循环退出;iteration-expr 在每次迭代后进行评估。

全部都是可选的;如果省略condition-expr,就好像它是1,因此:

for (;;) { // 永远  // ...}

登录后复制

永远循环(大概是通过break、return、goto、exit()、longjmp()、abort()之一退出,或者在C++中是throw)。

C++ 也有基于范围的 for 循环,但那是另一个故事了。

最初,init-clause只能是一个语句或表达式;从 C99 开始,它也可以是一个声明:

for ( 无符号 i = 0; i < m; ++i ) {

登录后复制

这很好,因为它限制了循环体中声明的变量的范围。也可以声明多个变量:

for ( 无符号 i = 0, j = 0; i < m && j < n; ++i, ++j ) {

登录后复制

迭代表达式 可以使用逗号运算符来计算多个子表达式。 (实际上,任何表达式都可以使用逗号运算符来计算多个子表达式。)

但是如果你想声明多个类型不同的变量怎么办?你不能。相反,您被迫在循环外声明不同类型的变量:

size_t i = 0;for (node_t *p = list->head; p->data; ++i, p = p->next ) {


登录后复制或者我是这么想的。正如我评论的:

即使是像 C 这样相对较小的语言,我仍然在学习新技术,尽管我已经使用 C 超过 35 年了。

事实证明,你

可以init-clause中声明多个类型不同的变量.

伎俩

诀窍是使用本地匿名结构:

for ( struct { size_t i; node_t *p; } 循环 = { 0, list->head };      循环.p->数据; ++loop.i,loop.p =loop.p->下一个 ) {

登录后复制

当然,你可以将循环命名为你想要的任何名称; iter 或者 it 都是合理的选择。

当然,它看起来很奇怪,而且必须引用循环有点难看——但你可以做到。它可能更有用的一个地方是,如果循环是宏的一部分,那么丑陋的地方就会被隐藏起来。

但是仅仅因为你能做到,你就应该吗?这是有争议的。毕竟,在循环外声明不同类型的变量并不那么可怕。 这是与所有变量都限制在循环范围内的重要性的权衡。 在 C 语言中,这通常并不那么重要。然而,在 C++ 中,如果至少一个循环变量属于具有析构函数的类型,并且它在循环终止后立即运行很重要,那么这可能证明使用结构体是合理的。 当然,C++ 具有可以替代使用的结构化绑定:

for ( auto [i, p] = std::make_tuple( 0, list->head ); p->数据; ++i, p = p->下一个 ) {

      结论

登录后复制

结构技巧当然没有那么重要,甚至可能不足以证明本文的存在。但我确实认为它很聪明,甚至在有限的情况下很有用,所以我认为它值得传递,因为我在超过 35 年的 C 编程生涯中从未遇到过它。

以上就是在“for”循环初始化子句中声明多个变量的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2557558.html

(0)
上一篇 2025年3月6日 08:01:23
下一篇 2025年2月22日 13:22:56

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 计算数字的c程序

    大家好我一直在写这个程序来计数数字,我想从某个起点打印到一定程度 //计数机#includeint main(){ int q1,q2,q3,q4,q5,q6,c=0,NOL,st; printf(“请输入您想要的组合数:”); scanf…

    2025年3月6日
    200
  • 为 C/C++ 程序员设置 VSCode DevContainer

    本文深入探讨了为早期 C/C++ 程序员提供基于 VS Code DevContainer 开发环境的设置。该环境在 Debian 上运行,因此对于所有学校/大学生来说也是一个很好的起点。 作为我对大学教学环境调查的一部分,我遇到了需要教授…

    2025年3月6日
    200
  • 用 JS 执行 C 代码——使用 Node 的 exec() 函数

    随着我深入研究 Linux、硬件和网络的基础知识,我越来越着迷于各种语言的程序最终如何翻译成机器语言来执行。这种认识激发了我对是否可以跨不同编程范例执行代码的兴趣。这使我成功地使用 JavaScript 运行了 C 程序。在这篇文章中,我将…

    2025年3月6日
    200
  • C 中的可变参数函数

    介绍 C 始终使用可以接受不同数量参数的函数 – variadic++ 函数 – printf() 是主要示例。最初,C 无法让您可移植地实现自己的可变参数函数。 当函数原型从 C++ 向后移植到 C 时,它包含声明…

    2025年3月6日
    200
  • C++框架与Java框架在可维护性方面的比较

    c++++ 和 java 框架的可维护性比较:c++ 框架:静态类型检查优势,资源管理需谨慎,头文件修改困难。java 框架:自动垃圾收集简化操作,注解增强灵活性,构建工具提升可维护性。 C++ 框架与 Java 框架的可维护性比较 在当今…

    2025年3月6日
    200
  • 在 C++ 框架中使用设计模式的好处有哪些?

    在 c++++ 框架中使用设计模式的优势有:可重用性:设计模式作为可重用组件,可节省开发时间。可维护性:遵循明确结构和原则,提高代码可维护性和可读性。灵活性:提供构建可扩展代码的蓝图,满足未来需求。 在 C++ 框架中使用设计模式的好处 设…

    2025年3月6日
    200
  • 扩展C++框架时如何管理依赖项?

    在扩展 c++++ 框架时,有效管理依赖项至关重要。可以通过以下方法实现:使用 cmake 定义依赖项:add_dependency()利用 boost.hana 库检查依赖项是否存在:constexpr bool has_dependen…

    2025年3月6日
    200
  • 剖析 C++ 框架中不同设计模式的权衡取舍

    选择合适的设计模式取决于应用程序的需求,权衡包括:可读性/可维护性:设计模式可以提高代码的可读性和可维护性。性能/可伸缩性:不同的模式会影响应用程序的性能和可伸缩性。耦合性/复杂性:模式可以降低耦合性,但也可能增加复杂性。 剖析 C++ 框…

    2025年3月6日
    200
  • C++框架与Java框架在成本方面的比较

    c++++ 框架的前期开发成本通常低于 java 框架,但 java 框架的长期维护成本较低,并且运行时成本较低。java 框架一般是免费和开源的,而 c++ 框架可能需要许可费用。综合考虑,java 框架在长期项目中可能具有更高的成本效益…

    2025年3月6日
    200
  • C++ 框架中设计模式的自动化实现与泛型应用

    自动化设计模式实现:c++++ 框架提供模板和算法,自动创建和管理设计模式实例。例如,boost 库中 creational::factory 模板用于工厂模式。泛型设计模式:标准库和外部库支持泛型编程,创建通用设计模式。例如,std::s…

    2025年3月6日
    200

发表回复

登录后才能评论