布尔值,如果不是0或1,运行时错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了布尔值,如果不是0或1,运行时错误相关的知识,希望对你有一定的参考价值。

布尔值,如果不是0或1,则为运行时错误

我想听听您如何理解这个问题。如果使用此C变体,是否可以这样编写代码块:

int b = 2;
if (b == 2) { 
    return 3;
}

不是返回值不能为3吗?我认为我的句子理解不正确。有人可以给我一个例子,说明这个C变体中无效条件语句的样子吗?了解布尔值。

答案

[==总是求值为01,因此在您所设想的情况下它绝不会导致运行时错误。

if(2)if(3)在您的假设中将是运行时错误,在“正常” C中,这些表达式的计算结果为true,因此将执行循环,实际上任何不是0的值positivenegative的值为true

评估01以外的值的优点的一个示例是strcmp()函数:

如果参数strcmp()0数组更大,则返回strings精确)相等,如果第一个参数按字典顺序出现在第二个参数之前,则为char值,反之则为negative值。

在这种情况下,您将想知道字符串是否相等,所以在positive(是if(strcmp(a, b))a,字符串)中,如果b返回strcmp()30,则您的表达式在“正常” C中仍然很好。该表达式的计算结果为-2和您会知道字符串是不同的。

在这种情况下,如果表达式的计算结果为true0以外的值,则有错误的示例优势是:

[如果您在尝试写入1时错误地写入了if(a = 2)。错误的表达式的计算结果为if(a == 2)2的值将分配为a,并且无论2的先前值如何,该表达式的计算结果均为true,由于代码编译正常。运行时错误将有助于发现错误。a

*请注意,如果您打开编译器警告,则可以保护这些错误,但这是直接的方法,有些语言不允许您使用*1 (true)

另一答案

[0 (false)如果if(condition) { a(); } else { b(); }不为零,则执行a();;如果condition为零,则执行b();

[这意味着将condition设置为condition2等其他值将具有与将其设置为3相同的效果。我了解您的想法的方式,这些其他值现在会导致运行时错误。

对于1==之类的运算符来说,这是无关紧要的,因为它们无论如何都只会求!=0的值,但是对于1char* pointer = malloc(10); if(pointer)之类的东西会有所不同(因为后者也可以计算为if(strcmp(a, b)))。

另一答案

标准C允许-1if语句的控制表达式使用任何标量表达式(任何算术或指针表达式),并且如果该表达式不为零(或对于指针,则为“ true”),空值)。这意味着我们可以编写诸如while的语句,其中if (p) { … }是指针,并且仅当p不是空指针时,它才会执行{ … }。这很方便。

但是,这也意味着可能会发生错误。程序员可能会意外地将p写入他们想要的位置x & 3 | y。后者的值始终为0或1,因为如果两个操作数都不为零,则x & 3 || y运算符将返回1,而如果两个都为零,则返回0。但是||的值可能不是0或1。因此C的变体为此给出了运行时错误,可以帮助在测试期间捕获该错误。

有效地,建议的更改要求控制表达式仅求值为布尔值0或1,从而使程序员编写更严格的布尔表达式,而不是标准C允许的自由格式表达式。这不是一个完美的更改,因为某些算术表达式即使不是正确的布尔表达式,也可能只求值为0或1(例如,我们通常认为x & 3 | y在做一些位操作,而不是像[ C0],但其计算结果仅为0或1),因此更改不会完全将控制表达式限制为布尔表达式。为实现此目标而进行的更好更改将进一步修改语法或约束,以便控制表达式必须为布尔表达式。

以上是关于布尔值,如果不是0或1,运行时错误的主要内容,如果未能解决你的问题,请参考以下文章

将布尔值自动提升为 int [重复]

GSON将布尔值序列化为0或1

如何测试多个(2个或更多)布尔值是不是为真

将学说实体布尔字段设置为 0 而不是 null

当使用多个规则时,规则应该返回一个字符串或布尔值,而不是接收到的“对象”

为啥 MySQL 将布尔值解释为 TINYINT(1) 而不是 BIT(1)?