如何编写一个使用n倍三元条件语句的C++布尔函数

How to write a C++ boolean function which uses n times the ternary condition statement?

本文关键字:条件 三元 语句 布尔 C++ 函数 何编写 一个      更新时间:2023-10-16

我有一个非常简单的问题,我对实现这个问题的方式感到非常困惑。我想在由三元语句组成的单行中创建一个布尔变量,例如:

boolean=a?b:(c?d:(e?f:(g?i:j);

为了我的代码的目的,它适用于1、2或3个这样的叠瓦状条件,但我可以选择将多少这样的三元条件放入彼此中来定义布尔变量。

我被这个卡住了,因为最后看起来我无法添加最后一个条件。我试着想一个递归函数,也许有一些计数器,但我写不出来。我不知道我问的是更简单还是更清楚。

条件并不是完全相互独立的,有一些间隔(空间中的坐标)以某种方式相互跟随。例如,我的例子中的"a"大约是11,然后当它为假时,它会继续,新的条件是22,依此类推。因此,我想在条件中引入一些计数器。

但是当我到达最后一个错误条件时,我不知道该怎么办,因为我不能设置一个随机的z>东西来使我的代码工作。

我正在尝试类似的东西:

bool f(double x, double value, double z, double d, double n, double step, int &count);{
bool result;
count++;
if (count == n) {return result}
result = (x >=value+count*step  && x<value+(count+1)*step) ? z>=d : f(x,value,z,d,n,step, &count);
}

当然,除了我编写递归函数的方式中可能有很多错误之外,因为我从来没有使用过它们,通常也不使用C或C++,在函数本身的最后一次调用中,我们会出现类似于?b:如果语句为false,则不包含最后一个参数。

我尽量说清楚。如果你不明白要点,你可以提问。任何帮助都是受欢迎的,递归函数、普通函数或完全不使用函数的方法。。。

提前向您致以最良好的问候和感谢!

编辑:

带有if的代码应该类似于:

if (a){
b}
else{
if (c){
d}
else{
if(e){
f}
else{
if(g){
I}
else{
j}

我可能忘记了一些括号,但我希望这是可以理解的。这一点是继续使用,比如说n,if语句,在一行中创建一个布尔变量,然后每次我想添加if语句时,都可以选择n,而不是重写新代码。

关于递归的编辑:

有人能解释一下为什么这种函数会产生一个无限循环吗?

bool f(double x, double l, double z, double d,  double step, int &count){
int  n = (int)l/step;\number of steps
count++;
if (count <  n)
return  (x >=l+count*step  && x<l+(count+1)*step) ? z>=d*count : f(x,l,z,d,step,count);
else               
return z>=d*(count-1);
}

在调用函数之前,我将计数器"count"设置为-1,这似乎是问题所在。它正确地执行了循环,但随后它一次又一次地重新启动,因此我甚至无法检查我的代码是否符合我的目的。我认为在每次递归调用函数的返回后,它会增加计数器,但一旦达到n,它应该返回其他东西并退出函数,而不是重新启动计数器并再次执行所有操作。。。

要更清楚地编写if ... else if梯形图,请去掉括号和缩进。像这样:

if (a)
boolean = b;
else if (c)
boolean = d;

等等。但我倾向于把它写成一个函数:

if (a)
return b;
else if (c)
return d;

等等。不过,如果你喜欢三元运算符,它可以用一种易于阅读的有纪律的方式编写:

boolean = a ? b
: c ? d
: e ? f
: g;

[第四版答案,考虑注释]

在所提供的第一个简单示例的特定情况下,可以编写变差函数。这里是模板。。。args参数表示数量可变的参数。可以调用f(false,false,true)或f(false、false、false,true、true)或更多参数。

bool ff(bool a, bool b, bool c) {
return a ? b : c;
}
template<class ...Args>
bool ff(bool a, bool b, Args ...args){
return a ? b : ff(args...);
}

正如用户463035818所提到的,当在第一次调用ff(.)函数时可能会评估所有布尔值时,(通过main)函数的第一次调用存在短路风险。我不知道编译器的优化会发生什么,可能会有内联和展开,但强调编译器是没有用的。

不管怎样,我现在明白了,步数是一个输入参数,可变模板函数似乎不适用。当然,使用递归函数来解决它是可能的,类似于您提出的函数。然而,在我看来,一个简单的"for循环"既高效又灵活。在我之前的回答中,我提出了一个基于for循环的解决方案。然而,由于它与您的需求不符,因为我误解了数学问题,我将其删除

相反,我回到您在文章中提出的第二个递归函数。您问为什么递归没有完成。我不能直接评论,因为我的声誉很差。由于我不明白为什么该计划没有停止,我实施了它,该计划正常完成,但结果似乎不正确。我看到一个关于参数l的问题。它似乎既对应于x的范围,也对应于x的最小值。我试图更正它。可能是我没有正确选择输入参数值。因此,我把相应的程序放在下面,以便您能够检查它。

#include    <iostream>
bool f(double x, double xmin, double range, double z, double d,  double step, int &count){
int  n = range/step;   //number of steps
count++;
if (count <  n) {
double a = xmin + count*step;
return  ((x >=a)  && (x< a + step)) ? z>=d*count : f(x,xmin,range,z,d,step,count);
} else               
return z>=d*(count-1);
}
int main () {
int count = -1;
double xmin = 0.0;
double x = 2.0;
double range = 4.0;
double step = 1.0;
double d = 1.0;
double z = 2.0;
bool test = f (x, xmin, range, z, d, step, count);
std::cout << "test = " << test << "n";
std::cout << "count = " << count << "n";
return 0;
}

在这种特殊情况下,最好将范围替换为n作为输入参数,以避免n的冗余计算。

可读性与效率

重点是我不希望我的代码优雅、可读但高效。

老实说,我认为这不是一个好策略。低效的代码并不优雅。当然,这并不意味着可读代码是自动高效的。然而,意外地阻止编译器进行优化要容易得多,而不是强迫它发出比它已经发出的更好的代码。可读代码确实包含较少的错误,并帮助您避免明显的效率低下。话虽如此,。。。

为什么不写一个可变条件函数

除了可读性,还有一件事需要考虑:短路。使用普通条件

bool x = condition ? t : some_other_function_call();

如果conditiontrue,则不会评估some_other_function_call(),而在中

bool x = foo(t,some_other_function_call());

在任何一种情况下都将调用另一个函数。foo不能短路。

该怎么办

Pete Becker的回答很好地展示了如何以干净的方式编写条件(最重要的是,当它们互斥时,你不需要嵌套这些情况(它们是三元的!))。

无论如何。。。变差条件函数是怎么写的

为了完整起见,以下是您可以编写这样一个函数来用函数调用(请不要)替换bool x = a ? b : (c ? d : (e ? f : (g ? i : j );的方法:

// DISCLAIMER: DONT DO THIS
bool my_conditional(std::vector<bool> x){
if (x.size() == 1) return *x.begin();
bool condition = *x.begin();
bool true_value = *(x.begin()+1);
return condition ? true_value : my_ternary({x.begin()+2,x.end()});
}

你可以这样称呼它:

my_conditional({ condition1, true_value1, condition2, true_value2, false_value});

例如

std::cout << my_conditional({false,false,false,false,false});

打印CCD_ 7。