这个条件是如何工作的?

How is this if condition working?

本文关键字:工作 何工作 条件      更新时间:2023-10-16

我有以下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,则if条件为真,如果返回0,则为假。

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

换句话说,我想知道if如何处理当它得到0和1以外的值

C和c++中的条件语句在没有给出其他条件的情况下隐式地与"不等于零"进行比较。例:if (data->tokens.size())if (data->tokens.size() != 0)相同。

if接受一个真或假bool表达式,而不是一个数字。对我们来说幸运的是,如果给出一个数字,它将被转换为bool类型。如果数字为0,则为False,否则为true,因此可以工作

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

是有条件的,不是循环。如果为真,则输入条件块。如果它是零,那么它是假的,它不会进入block。如果存在除0以外的值则为true,并进入block

if(data->tokens.size()) ~ if(data->tokens.size()!=0) 

更准确地说:标准是:

6.4选择语句

selection-statement:

if ( condition ) statement
条件规则既适用于选择语句,也适用于forwhile语句(6.5)。…条件的值除switch语句外的语句中的初始化声明语句是声明的变量在上下文环境中转换的值转换为bool(第4条)。如果该转换是病态的,则程序是错误的不规范的。以表达式形式出现的条件的值是表达式的值,上下文中将转换为bool;如果是转换是病态的,程序是病态的。

转换为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类型的右值。一个零值、空指针值或空成员指针值进行转换to 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...
    }

在这两种情况下,只有当size()>0使if冗余时,for才会进入