更改if语句

时间:2015-05-08 17:37:44

标签: c if-statement

我正在玩我的代码并开始想知道这是否会改变:

if(array[index] == 0)

到此:

if(!array[index] != 0)

可能会影响任何代码,或者只是做同样的事情,我不需要担心我是怎么写的?

5 个答案:

答案 0 :(得分:2)

考虑一些真值表,假设array是一个整数数组:

array[index] | array[index] == 0 | !array[index] | !array[index] != 0
0            | T                 | 1             | T
1            | F                 | 0             | F
non-zero     | F                 | 0             | F

这两个表达式在逻辑上是等价的,因此任何一个表达式都应该按照您的预期工作。

但是,你应该用第一种形式写出来。你清楚地知道第一种形式是有效的。任何人都会看到它会理解它的工作原理。但第二,你有疑虑,因为它不清楚。这是不可读的。你应该总是去寻找不清楚的东西。不要试图用简单的事情来聪明。

答案 1 :(得分:1)

他们是不同的。如果您想要if(array[index] == 0),那么您需要if(!(array[index] != 0))

答案 2 :(得分:1)

他们是不同的。如果您尝试将==更改为使用!,那么在(array[index] !=0)处,您可以检查索引处的值不等于0时的条件。

答案 3 :(得分:1)

我刚检查了一个简单的函数,看看会发生什么:

int matrix (int *array, int n)
{
  int c = 0;
  int index = 0;

  for (index=0;index<n;index++)
    if (array[index]==0)
      c++;

  return c;
}

顺便说一句:你没有指定array所具有的元素类型。我假设它们是ints,但如果它们是floatsdoubles,则可能会更改以下参数:

无论我将if行更改为什么。我试过了:

if (array[index]==0)

if (!(array[index]!=0))

if (!array[index])

用以下内容编译后:

    gcc -O0 -c -S -m32 ifs.c

这三个选项生成相同的汇编代码:

        movl    (%eax), %eax
        testl   %eax, %eax
        jne     .L3
        addl    $1, -4(%ebp)
.L3:
        addl    $1, -8(%ebp)

如果我启用优化:

    gcc -O3 -c -S -m32 ifs.c

这三个版本生成此代码:

        cmpl    $0, (%edx)
        leal    1(%eax), %ecx
        jne     .L4
        movl    %ecx, %eax
.L4:
        addl    $4, %edx

所以你写它的方式并不重要;编译器将推断出相同的含义并生成相同的代码,因此将其写为最易读的方法来缓解maintentace。

对于浮点数,使用-O0和-O3编译的代码之间确实存在差异。对于浮点数,存在一些选项,因为可以生成SSE2的代码而不是数学协处理器的代码。

答案 4 :(得分:0)

两者都是不同的条件。 !的优先级高于==,因此!array[index] != 0相当于(!array[index]) != 0。 等同于array[index] == 0的是!(array[index] != 0)