如何重新设置 C 代码的样式以从 if 语句条件中排除赋值
How to restyle C code to exclude assignments from if statement conditions
我倾向于通过 Linux 内核黑客来编写代码,主要是做清洁补丁。最近我遇到了一些不寻常的 if 语句,这些语句在语句的条件部分内包含变量赋值。
if (!strcmp(filename, "-"))
cpio_list = stdin;
else if (!(cpio_list = fopen(filename,"r"))) {
...
...
}
checkpatch.pl 称之为样式错误。我会(我可以吗?)以什么方式重构这段代码而不破坏它?
文件:linux/usr/gen_init_cpio.c
赋值表达式有值。它的值是赋值后其左操作数的值。
所以 cpio_list = fopen(filename,"r")
可以有效地用在表达式中,特别是作为条件。
有些人认为这会降低代码的可读性,并且更喜欢显式测试:
else if ((cpio_list = fopen(filename,"r")) != 0)
请注意,括号是必需的,因为 =
的优先级低于 ==
和 !=
。
if (!strcmp(filename, "-"))
cpio_list = stdin;
else {
cpio_list = fopen(filename,"r");
if (! cpio_list) {
...
}
}
拆分 else if
以便您可以在 if
之前完成作业。
if (!strcmp(filename, "-"))
cpio_list = stdin;
else {
cpio_list = fopen(filename,"r")
if (!cpio_list) {
...
...
}
}
但是您可能想要重构一个函数,这样您就可以在 else
.
之前 return
就我个人而言,我认为偶尔进行 assignment-in-if-condition 没什么大不了的,只要它被括号括起来(这意味着程序员的意思,它很明显,并且抑制了编译器警告)。
您需要清除所有不良编程习惯的代码:
- 避免在条件内赋值,因为它往往会产生错误,有时会使代码更难阅读(MISRA-C 禁止在条件内赋值)。
- 不要使用布尔运算符检查指针是否为 NULL,或检查整数是否为 0。它可以工作,但没有任何意义,并且会使代码更难阅读(也被 MISRA-C 禁止)。
- 在每个语句后使用大括号以防止意外错误。
努力编写清晰、明确、自记录的代码。
if (strcmp(filename, "-") == 0)
{
cpio_list = stdin;
}
else
{
cpio_list = fopen(filename,"r");
if(cpio_list == NULL)
{
// error handling
}
}
我倾向于通过 Linux 内核黑客来编写代码,主要是做清洁补丁。最近我遇到了一些不寻常的 if 语句,这些语句在语句的条件部分内包含变量赋值。
if (!strcmp(filename, "-"))
cpio_list = stdin;
else if (!(cpio_list = fopen(filename,"r"))) {
...
...
}
checkpatch.pl 称之为样式错误。我会(我可以吗?)以什么方式重构这段代码而不破坏它?
文件:linux/usr/gen_init_cpio.c
赋值表达式有值。它的值是赋值后其左操作数的值。
所以 cpio_list = fopen(filename,"r")
可以有效地用在表达式中,特别是作为条件。
有些人认为这会降低代码的可读性,并且更喜欢显式测试:
else if ((cpio_list = fopen(filename,"r")) != 0)
请注意,括号是必需的,因为 =
的优先级低于 ==
和 !=
。
if (!strcmp(filename, "-"))
cpio_list = stdin;
else {
cpio_list = fopen(filename,"r");
if (! cpio_list) {
...
}
}
拆分 else if
以便您可以在 if
之前完成作业。
if (!strcmp(filename, "-"))
cpio_list = stdin;
else {
cpio_list = fopen(filename,"r")
if (!cpio_list) {
...
...
}
}
但是您可能想要重构一个函数,这样您就可以在 else
.
return
就我个人而言,我认为偶尔进行 assignment-in-if-condition 没什么大不了的,只要它被括号括起来(这意味着程序员的意思,它很明显,并且抑制了编译器警告)。
您需要清除所有不良编程习惯的代码:
- 避免在条件内赋值,因为它往往会产生错误,有时会使代码更难阅读(MISRA-C 禁止在条件内赋值)。
- 不要使用布尔运算符检查指针是否为 NULL,或检查整数是否为 0。它可以工作,但没有任何意义,并且会使代码更难阅读(也被 MISRA-C 禁止)。
- 在每个语句后使用大括号以防止意外错误。
努力编写清晰、明确、自记录的代码。
if (strcmp(filename, "-") == 0) { cpio_list = stdin; } else { cpio_list = fopen(filename,"r"); if(cpio_list == NULL) { // error handling } }