【问题标题】:How is this if condition working?如果条件有效,这将如何?
【发布时间】:2013-04-08 10:35:22
【问题描述】:

我有以下 IF 语句,但我无法弄清楚它的含义:

if (data->tokens.size()) 
{..
  //reads each token in a for loop and assigns each token to a variable...
}

令牌中有六个值,所以 tokens.size() 应该返回 6,对吧?

我不明白为什么我们需要一个 if 条件?据我了解,如果tokens.size() 返回 1 则条件为真,如果返回 0 则条件为假。

在我的例子中,它返回 6(或任何数量的令牌,可以是任何数字,而不仅仅是 0 或 1)。那么 if 条件如何工作呢?

也就是说,我想知道 if 得到 0 和 1 以外的值时如何处理。

【问题讨论】:

  • Nitpick:if 不是“循环”。
  • 谢谢大家,我得到了答案。是的,if 不是循环而是条件语句 :)
  • 我建议您将其更改为if ( ! data->tokens.empty() ) {...}。它不那么令人困惑(在某些情况下可能会稍微快一些,尽管这不是一个很好的理由)。
  • @BoBTFish both 你的理由在这里似乎很好。 :)
  • @DrewDormann 我不同意。使代码更清晰是一个很好的理由(证明:存在这个问题),但是在极少数情况下这会带来性能改进,而且它是如此微不足道,以至于不值得进行更改。

标签: c++ if-statement


【解决方案1】:

如果没有给出其他信息,C 和 C++ 中的条件语句会隐式地与“不等于零”进行比较。例如。 if (data->tokens.size())if (data->tokens.size() != 0) 相同。

【讨论】:

  • 所以这意味着如果我有一些标记,那么它接受 if 条件,并且只有当标记为空时它才会执行 if 语句之后要执行的任何内容?
  • 如果它不为空(所以如果size() 返回的不是零)。
【解决方案2】:

if 采用真或假布尔表达式,而不是数字。对我们来说幸运的是,如果你给出一个数字,它将被转换为一个布尔值。如果数字为 0,则为 false,否则为 true,因此它会起作用。

【讨论】:

    【解决方案3】:

    我认为这只是对非空性的测试,以确保我们不会迭代空向量

    【讨论】:

      【解决方案4】:

      它是有条件的而不是循环。如果为真,则进入条件块。如果它为零,那么它是错误的并且它不会进入块。如果有除 0 以外的任何其他值,则为 true 并进入块。

      【讨论】:

        【解决方案5】:
        if(data->tokens.size()) ~ if(data->tokens.size()!=0) 
        

        【讨论】:

        • 不,因为如果size() 返回 -1 或 -31212128317981,这也是正确的。 (从上下文来看,不可能说size() 返回的是有符号值还是无符号值)。
        • 如果它返回 false 是否会更好?
        【解决方案6】:

        为了更准确:standard 说:

        6.4 选择语句

        选择声明:

        if ( condition ) statement
        

        …条件规则既适用于选择语句,也适用于 forwhile 语句 (6.5)。 … 一个条件的值是 语句中的初始化声明,而不是 switch statement 是根据上下文转换的声明变量的值 至bool(第 4 条)。如果该转换格式不正确,则程序为 格式不正确。 ……作为表达式的条件的值是 表达式的值,根据上下文转换为bool 转换是非良构的,程序是非良构的。

        转换为布尔的意思是:

        4 标准转换

        某些语言结构要求将表达式转换为 一个布尔值。表示出现在这种上下文中的表达式e 被上下文转换为bool 并且当且仅当 声明 bool t(e); 格式良好,对于某些临时发明的 变量 t (8.5)。

        这很重要。这就是为什么你可以做这种“魔法”:

        while(getline(cin,str))) cout<<str;
        

        with 将应用bool(cin)(在这种情况下getline 返回cin))

        在您的示例中,转换将是:

        4.12 布尔转换 [conv.bool]

        1 算术、无范围枚举、指针或指针的纯右值 to 成员类型可以转换为类型为bool 的纯右值。一个零 值、空指针值或空成员指针值被转换 给false;任何其他值都将转换为true。为了 直接初始化 (8.5),std::nullptr_t 类型的纯右值可以是 转换为bool 类型的纯右值;结果值为false

        顺便说一句,您示例中的if 可能几乎没有用,甚至只是混淆了代码。考虑:

        for (int i=0; i< data->tokens.size(); ++i) 
        {..
          //reads a token and assigns to a variable...
        }
        

        或:

        for( const auto &token : data->tokens)
            {..
              // assigns token to a variable...
            }
        

        在这两种情况下,for 只会在 size()&gt;0 使 if 成为冗余时进入。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-12-08
          • 1970-01-01
          • 2012-11-21
          • 1970-01-01
          • 2017-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多