我目前正在研究objective-c和基本的c编程语言。
我对特定代码行有疑问:
if (!balance)
Balance是一个创建的对象。我知道这段代码正在检查对象余额是否为零,这是正确的吗?
有人可以解释一下代码究竟是如何检查nil的吗?如果balance的值为非零,则返回0,如果值为0,则返回1吗?
提前致谢。
答案 0 :(得分:1)
在Objective-C中,nil
大致类似于0
,NULL
或false
,但对于对象指针。在if
语句中,它的行为与上述标量值之一相同。例如,以下两个if
语句应该产生相同的结果:
NSNumber *balance = nil;
if (!balance) {
// do something if balance is nil
}
if (balance == nil) {
// do something if balance is nil
}
答案 1 :(得分:0)
NSLog应该返回(null)(可能是nil的描述),而不是控制台中的NULL。您的支票应如下所示:
if (!controller)
{
// do some stuff here
}
答案 2 :(得分:0)
如果balance
为nil
,那么它将成为指向0x0
的指针。该地址永远不会用于有效对象。
在C中,评估为零的if
内的任何内容都被视为否定响应,评估为非零的任何内容都是肯定响应。
指针评估其地址 - 就像将它们转换为整数类型一样。 !
表示“不”。
所以测试是if(address of balance is not zero)
。
答案 3 :(得分:0)
首先,您需要了解if
的工作原理。基本上,任何非零值都被视为true,零值被视为false。
if (10)
之类的简单内容将被视为true,而if (0)
则视为false。
任何表达式的计算结果为零值或非零值。
对象指针只是一个数字 - 一个内存地址。 nil
指针只是地址0.任何非零指针都有一个非零地址。
!
运算符否定了该状态。非零值将被视为零值,反之亦然。
所以现在结合所有这些。
Foo *bar = nil;
if (bar) // false since bar is nil (or zero)
Foo *bar = [[Foo alloc] init]; // some non-nil value
if (bar) // true since bar is non-zero
Foo *bar = nil;
if (!bar) // true since !bar mean "not bar" which is "not zero" which is "non-zero"
Foo *bar = [[Foo alloc] init]; // some non-nil value
if (!bar) // false since !bar mean "not bar" which is "not non-zero" which is "zero"