我正在玩我的代码并开始想知道这是否会改变:
if(array[index] == 0)
到此:
if(!array[index] != 0)
可能会影响任何代码,或者只是做同样的事情,我不需要担心我是怎么写的?
答案 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
,但如果它们是floats
或doubles
,则可能会更改以下参数:
无论我将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)
。