gpt4 book ai didi

c++ - C++ -for循环中的条件未评估,因为我认为应该如此

转载 作者:行者123 更新时间:2023-12-01 14:39:50 25 4
gpt4 key购买 nike

我对C++很陌生,并且遇到了某种问题。我想问问是否有人可以向我解释为什么for条件下的评估不起作用。

这是我编写的程序的一部分,有一个rpm值,该值由用户提供,并与rpm_case进行分类,以便稍后进行一些计算。

它应该做什么:

  • rpm在800到1200之间==> rpm_case = 0
  • rpm在1200至1800之间==> rpm_case = 1
  • rpm在1800到2500之间==> rpm_case = 2
  • rpm在2500到3500之间==> rpm_case = 3

  • ================================================== ======================

    首先,我为此使用了30行长的if-construction,但是我已经丢弃了它,并用以下更短,更好的方式替换了它(这按预期工作):
    const float rpm_bases[known_rpm_bases] = {800, 1200, 1800, 2500, 3500};
    short rpm_case;
    for (rpm_case=0;; rpm_case++) {
    if (!(rpm > rpm_bases[rpm_case+1])) {break;}
    }

    但是我仍然不开心,因为我真的想通过for循环来摆脱if。
    但是for循环总是循环遍历整个数组的大小,而不是在考虑的点中断。
    const float rpm_bases[known_rpm_bases] = {800, 1200, 1800, 2500, 3500};
    short rpm_case;
    for (rpm_case=0; (!(rpm > rpm_bases[rpm_case+1])); rpm_case++) {}

    ??似乎以某种方式似乎不可能在for循环的条件部分内用反变量来评估数组?还是我只是在做完全错误的事情,我也不想排除该选项。

    非常感谢大家。

    最佳答案

    for语句的中间表达式是必须重复的条件。因此,必须与条件完全相反才能使循环中断。

    因此,您必须通过删除!(NOT)运算符来取反表达式,如下所示:
    for (rpm_case=0; rpm > rpm_bases[rpm_case+1]; rpm_case++);
    此表达式适用于您的问题中所述的情况。但是,如果rpm高于3500,则将导致对rpm_bases数组的访问超出范围,从而导致undefined behavior。因此,以以下方式编写循环会更安全:

    for ( rpm_case=0; rpm_case < known_rpm_bases; rpm_case++ )
    {
    if ( rpm <= rpm_bases[rpm_case] ) break;
    }

    这样,如果 rpm_case高于最大值,您的程序将只给您额外的 rpm增量,而不是超出范围而导致不确定的行为。

    关于c++ - C++ -for循环中的条件未评估,因为我认为应该如此,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60476576/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com