如果声明没有if?

时间:2014-03-20 23:37:54

标签: c

我看到的代码看起来像是在没有实际if的情况下尝试做if语句,而且我很困惑它实际上在做什么。例如,

int* value;
int thisValue = 0;
int checkedValue = 1;
*value = thisValue == checkedValue

这实际上是在没有if?

的if语句中

4 个答案:

答案 0 :(得分:4)

这只是评估一个布尔表达式。并将其存储在任何内存位置value指向(在您的特定代码段value中未分配,因此行为未定义)。

if允许您根据布尔表达式的值执行不同的代码。

例如,

if (a == b) {
  printf("a and b are the same\n");
}

表现如下:

int same = (a == b);
if (same) {
  printf("a and b are the same\n");
}

虽然第一个通常更干净,除非你有理由在if语句之后想要same变量。但第二个更靠近C代码在编译时生成的机器指令。

尽管==语句中经常使用像if这样的布尔比较运算符,但没有什么能够强制它们仅用于 。您可以在代码中的任何位置使用==运算符来生成布尔表达式,就像您可以在任何位置使用+运算符来生成数值表达式一样。

答案 1 :(得分:3)

您似乎误解了if条件语句的概念。

==>之后的括号不限制使用!=ifwhile等运算符。他们进行操作,就像任何其他操作员一样。例如;

        // evaluates into...
2 + 3;  // 5
9 / 4;  // 2
7;      // 7
5 == 5; // 1
4 != 5; // 1
9 < 1;  // 0

依此类推......像均等和不等式这样的布尔运算符可以评估为01。如果为true,则评估为1,如果为false,则评估为0

每个不是0的值都被C语言解释为true。每个非零值都是真的。 尽管每个非零值都为真,但布尔运算的结果严格为零或一,而不是任何其他数字。

就像您可以在if括号之外使用这些内容一样,您可以在if括号内使用其他内容,如下所示:

if ( 2 + 3 ) {
    // this block will happen
    // because 2 + 3 is 5
    // and 5 is non-zero
}

if ( 10 - 6 - 4 ) {
    // this block won't happen
    // because 10 - 6 - 4 is zero
}

所以,是的......最后一个例子:

6 && 4; // evaluates to 1
0 && 4; // evaluates to 0

答案 2 :(得分:1)

不,这不是if声明。它只是改变'thisValue == checkedValue'并将其分配给=运算符左侧的变量。

int isTrue = thisValue == checkedVaue;

稍后可以在if声明中使用。

if ( isTrue )
{
 ...
}

这相当于

if ( thisValue == checkedVaue )
{
 ...
}

也可以在while声明中使用。

while ( isTrue )
{
 ...
}

答案 3 :(得分:-1)

首先,正如alecbenzer所说,代码是致命的错误,指针“值”没有指向任何内存,如果你将任何内容存储到“* value”,它将导致分段错误。

修复代码:

int resultHolder;
int* value;
value = &resultHolder;
int thisValue = 0;
int checkedValue = 1;
*value = thisValue == checkedValue;

对于你的问题,(* value = thisValue == checkedValue)不是if语句。

==是一个运营商,就像+。

a + b给出a和b之和。

a == b给出a和b是否相等的结果,结果为真(c中的整数1)或false(c中的整数0)。

现在,想想* value =(a == b);在你读取* value =(a + b);的方式中,它只是将一个评估结果分配给一个变量。