C 更简洁的返回语句
我最近开始用C编程,想知道一种更简洁的方法来编写一个简单函数,根据两个int值的相等性返回1或-1。我写的是:C 更简洁的返回语句,c,C,我最近开始用C编程,想知道一种更简洁的方法来编写一个简单函数,根据两个int值的相等性返回1或-1。我写的是: int valueCompare(int i, int j) { if (i != j) { return -1; } else { return 1; } } 它可读,但似乎效率低下。我见过使用冒号和问号的返回语句,但是我不熟悉这种风格。有人对如何在不损失可读性的情况下为此编写更高效的函数有什么建议吗?您可以使用三元运
int valueCompare(int i, int j) {
if (i != j) {
return -1;
}
else {
return 1;
}
}
它可读,但似乎效率低下。我见过使用冒号和问号的返回语句,但是我不熟悉这种风格。有人对如何在不损失可读性的情况下为此编写更高效的函数有什么建议吗?您可以使用三元运算符:
int valueCompare(int i, int j)
{
return (i == j) ? 1 : -1;
}
它是可读的,编译器有责任使其高效。任何“聪明”的写作方式都会降低可读性,也不会提高效率 基本上,当只有一个语句时,我会忽略大括号,即使这是一个品味问题:
if(i != j)
return -1;
else
return 1;
vs
vs
当然,我可以想出许多“聪明”的写作方法
return (i != j) ? -1 : 1;
这只适用于简单的表达式(也就是说,这是可以的,但是如果再加上几个函数调用,它将是完全不可读的)
但是这几乎不可读。然而,你应该能够理解它,因为你可能会在野外看到这种东西
这两种方法都无法提高效率。如何
#define SAME_VALUE 1
#define DIFFERENT_VALUE -1
还是类似的?
那你呢
int valueCompare (int i, int j){
return i == j;
}
可读性,考虑改写函数,使用布尔逻辑代替:
#include <stdbool.h>
bool isEqual (int i, int j) {
return i == j;
}
这有很多好处:
- 通用函数格式
- 标准。可以传递给
等函数b搜索、qsort
- 在单个函数中混合相等、小于和大于检查
- 与恐龙编译器兼容
编写一个简单的函数,根据两个int值的相等程度返回1或-1
只是一个注释,但在C
世界中,对于本质上是布尔函数的函数,返回-1
或1
将是一个非常不寻常的设计选择(或要求)。更常见的是返回0
或1
(或任何!=0
)在这种情况下,它将全部减少到返回i==j
@dxiv感谢您的建设性和有效的批评;你是对的,如果我的主函数返回一个0@SadiRubaiyet非常感谢您命名了我想不起的术语(三元运算符)。考虑到使用它的返回语句的普遍性(从我在谷歌上看到的情况来看),我认为这将是未来在我的C代码中使用的一个完全可读的选择?你应该坚持“可读”。编码非常简单,测试较少,调试非常困难。采用减少总体工作量的编码方式。”“聪明”的编码通常只是糟糕的编码。我曾经说过同样的话。问题的标题清楚地指出:“一个更简洁的返回语句”。这就说明了,三元运算符是常见的。我不同意在这种情况下它的可读性较差。不过,条件运算符有奇怪的副作用,所以不应该盲目地将其用作某种“万灵药”。考虑下面的场景:<代码> int a=1;无符号整数b=1;长c=-1然后做if((真?a:b)!=c)put(“-1!=-1”)代码>将打印-1!=-1
。该错误是由条件运算符在第二个操作数和第三个操作数之间的非直观提升引起的,无论实际计算的是第二个操作数还是第三个操作数,都会发生这种情况。三值运算符是常见的。“我不同意在这种情况下它的可读性较低。”米奇麦,如果只是一个简单的比较,是的。但我想这只是一个在实践中相当复杂的人为例子。好吧,我们只能回答所问的问题,而不是一些假设性的问题。@MitchWheat,这就是我正在做的。回答问题。我只是假设这是一个一般性的问题,所以我是一般性地回答。@JanHudec我忘记了,如果if/else if/else后面只有一个语句,那么大括号是不必要的。谢谢你的提醒!
#define SAME_VALUE 1
#define DIFFERENT_VALUE -1
int valueCompare (int i, int j){
return i == j;
}
#include <stdbool.h>
bool isEqual (int i, int j) {
return i == j;
}
int compare_int (const void* i1, const void* i2)
{
const int* ip1 = i1;
const int* ip2 = i2;
return *ip1 - *ip2;
}