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

问题描述 投票:-1回答:3

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

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

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

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

c boolean logic
3个回答
1
投票

[==总是求值为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
投票

[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)))。


0
投票

标准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),因此更改不会完全将控制表达式限制为布尔表达式。为实现此目标而进行的更好更改将进一步修改语法或约束,以便控制表达式必须为布尔表达式。

© www.soinside.com 2019 - 2024. All rights reserved.