为什么在init方法中使用双括号,或者是1 ==(1)?

时间:2013-03-13 07:55:42

标签: objective-c c

在评估某些含义时,括号会做什么? 我在代码中遇到过这种情况,当检查某些内容并使用

if ( (some condition that returns 1) )
{
code
}

所以我的问题是,这评估为真吗?我认为它总是错误的,因为(1)不返回任何东西?

编辑:澄清,问题是为什么双括号中的if?我知道1是真的。

4 个答案:

答案 0 :(得分:10)

当赋值用于其真值时,将使用其他括号。它们允许编译器区分

if ((var = expr))

作为任务和真值测试的合法组合,

if (var = expr)

作为if (var == expr)的拼写错误。

从C和C ++继承的惯例是编译器在if (var = expr)上警告if (var == expr)可能的拼写错误。它们不会在if ((var = expr))上发出警告,因为额外的括号集向编译器发出指示,指出意图。正如rob mayoff所解释的那样,clang有一个特殊情况,不会对self的某些任务发出警告,但对于许多程序员而言,习惯仍然存在。

正如其他人所说,生成的代码完全相同,有没有额外的parens。

答案 1 :(得分:4)

如果你写,

if (self = [super init]) { // Warning
    // ...
}

编译器会给你一个警告,因为它认为你可能错误地将=列为==。如果添加第二组括号,警告就会消失。

if ((self = [super init])) { // No warning
    // ...
}

因此额外的括号可能会使拼写错误的可能性降低。括号不会更改表达式的值。

答案 2 :(得分:2)

通常0等于false,NOT 0等于true。

此链接解释了objective-c中的bool:http://www.mindsizzlers.com/2010/04/objective-c-and-the-properties-of-bool/

答案 3 :(得分:1)

boolint

的真假值
  • false的布尔值相当于int的{​​{1}}值。
  • 0的布尔值相当于非零的true值(例如int110等)

例如,请考虑下面的C代码示例:

3000

包含多个括号:

以下两个片段将完全返回相同的结果。

bool bValue;
int nValue;

bValue = true;
nValue = 1;

if (bValue == nValue) {
    printf("bValue and nValue are the same!\n");
}

// output: bValue and nValue are the same!

返回与:

相同的结果
if ((((((((((((((((((((1)))))))))))))))))))) {
   printf("Hello World!\n");
}

if (1) { printf("Hello World!\n"); } 语句

中的表达式

在给定的if语句中,您必须具有解析为true或false值的表达式。有关表达的示例,请参阅this页面。