C 什么';检查任何值是否为NULL或空的最佳方法是什么?
我想知道检查空值的最佳方法(我指的是性能和正确性)是什么 我知道这两种方法: 首先(我认为最好): 对于任何指针检查:C 什么';检查任何值是否为NULL或空的最佳方法是什么?,c,if-statement,null,C,If Statement,Null,我想知道检查空值的最佳方法(我指的是性能和正确性)是什么 我知道这两种方法: 首先(我认为最好): 对于任何指针检查: if (value == NULL) ... 对于int: if (value == 0) ... 第二: if (value) ... 您应该使用“第一”,因为它更容易理解、维护 性能方面没有明显差异。您应该使用“第一”,因为它更容易理解、维护 性能方面没有明显差异。两者的性能相同,并且很可能产生完全相同的汇编代码。用你认为合适的任何东西 这是一个好主意,考虑你的代码
if (value == NULL) ...
对于int
:
if (value == 0) ...
第二:
if (value) ...
您应该使用“第一”,因为它更容易理解、维护
性能方面没有明显差异。您应该使用“第一”,因为它更容易理解、维护
性能方面没有明显差异。两者的性能相同,并且很可能产生完全相同的汇编代码。用你认为合适的任何东西
这是一个好主意,考虑你的代码将如何解释其他编码器。从可读性的角度来看,
if(value==NULL)
似乎比if(!value)
更清晰。但这是风格的问题。两者的性能相同,并且很可能产生完全相同的汇编代码。用你认为合适的任何东西
For an Int : if (value == 0)
这是一个好主意,考虑你的代码将如何解释其他编码器。从可读性的角度来看,if(value==NULL)
似乎比if(!value)
更清晰。但这是风格的问题
For an Int : if (value == 0)
对于int
,如果值为0
。这并不意味着该参数为空,而是意味着该参数包含值0
就性能而言,没有区别。您可以通过检查编译的汇编代码来检查这一点
下面给出了组装代码
#include<stdio.h>
int main()
{
int a=0;
if(a==0)
printf("hello");
}
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $0, -4(%rbp)
cmpl $0, -4(%rbp)
jne .L3
movl $.LC0, %edi
movl $0, %eax
call printf
#包括
int main()
{
int a=0;
如果(a==0)
printf(“你好”);
}
主要内容:
.LFB0:
.cfi_startproc
pushq%rbp
.cfi_def_cfa_偏移量16
.cfi_偏移量6,-16
movq%rsp,%rbp
.cfi_def_cfa_寄存器6
subq$16,%rsp
movl$0,-4(%rbp)
cmpl$0,-4(%rbp)
jne.L3
movl$.LC0,%edi
movl$0,%eax
调用printf
对于这一次
#include<stdio.h>
int main()
{
int a=0;
if(a)
printf("hello");
}
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $0, -4(%rbp)
cmpl $0, -4(%rbp)
je .L3
movl $.LC0, %edi
movl $0, %eax
call printf
#包括
int main()
{
int a=0;
如果(a)
printf(“你好”);
}
主要内容:
.LFB0:
.cfi_startproc
pushq%rbp
.cfi_def_cfa_偏移量16
.cfi_偏移量6,-16
movq%rsp,%rbp
.cfi_def_cfa_寄存器6
subq$16,%rsp
movl$0,-4(%rbp)
cmpl$0,-4(%rbp)
je.L3
movl$.LC0,%edi
movl$0,%eax
调用printf
您可以看到这两个代码是相同的,因此在性能方面没有差异
但是,正如其他人提到的,第一个
更容易理解,也更清晰。应该这样做
对于int
,如果值为0
。这并不意味着该参数为空,而是意味着该参数包含值0
就性能而言,没有区别。您可以通过检查编译的汇编代码来检查这一点
下面给出了组装代码
#include<stdio.h>
int main()
{
int a=0;
if(a==0)
printf("hello");
}
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $0, -4(%rbp)
cmpl $0, -4(%rbp)
jne .L3
movl $.LC0, %edi
movl $0, %eax
call printf
#包括
int main()
{
int a=0;
如果(a==0)
printf(“你好”);
}
主要内容:
.LFB0:
.cfi_startproc
pushq%rbp
.cfi_def_cfa_偏移量16
.cfi_偏移量6,-16
movq%rsp,%rbp
.cfi_def_cfa_寄存器6
subq$16,%rsp
movl$0,-4(%rbp)
cmpl$0,-4(%rbp)
jne.L3
movl$.LC0,%edi
movl$0,%eax
调用printf
对于这一次
#include<stdio.h>
int main()
{
int a=0;
if(a)
printf("hello");
}
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $0, -4(%rbp)
cmpl $0, -4(%rbp)
je .L3
movl $.LC0, %edi
movl $0, %eax
call printf
#包括
int main()
{
int a=0;
如果(a)
printf(“你好”);
}
主要内容:
.LFB0:
.cfi_startproc
pushq%rbp
.cfi_def_cfa_偏移量16
.cfi_偏移量6,-16
movq%rsp,%rbp
.cfi_def_cfa_寄存器6
subq$16,%rsp
movl$0,-4(%rbp)
cmpl$0,-4(%rbp)
je.L3
movl$.LC0,%edi
movl$0,%eax
调用printf
您可以看到这两个代码是相同的,因此在性能方面没有差异
但是,正如其他人提到的,
第一个
更容易理解,也更清晰。应该使用它如果(value==NULL)您应该始终使用它,因为它是最清晰、最明确的形式
if(value==0)
或if(!value)
是常见的变量,但它们不太清晰,因为您无法判断其目的是检查指针还是变量的值
上述三种形式之间没有性能差异,它们将产生完全相同的机器代码
风格细节: 从风格上讲,最好总是将
if
语句视为期望布尔类型(如在C++中)。不幸的是,C仍然使用int,而不是真正的布尔类型,因此整数和布尔表达式之间不存在类型安全性
但您可以像编写真正的布尔类型一样编写代码,因为这样您就可以使用外部静态分析器来为布尔表达式获得更强的类型。例如,MISRA-C使用一个术语“本质上是布尔型的”来实现这一点
这是一种非常好且有效的方法,可以消除晦涩难懂的表达式和与类型相关的bug
在这种代码中,不允许使用if(value)
或if(!value)
,因为本例中的值是指针,而不是布尔值
资料来源:MISRA-C:2012规则10.1、11.9、14.4如果(值==NULL),则应始终使用
,因为它是最清晰、最明确的形式
if(value==0)
或if(!value)
是常见的变量,但它们不太清晰,因为您无法判断其目的是检查指针还是变量的值
上述三种形式之间没有性能差异,它们将产生完全相同的机器代码
风格细节:
从风格上讲,最好总是将if
语句视为期望布尔类型(如在C++中)。不幸的是,C仍然使用int,而不是真正的布尔类型,因此整数和布尔表达式之间不存在类型安全性
但是你可以