有没有更简单的方法:if(num1 > num2 && num1 > num3),用于比较更大的变量列表?
is there a simpler way to do: if(num1 > num2 && num1 > num3), for bigger list of variables to compare?
我想知道(只是为了知道)是否有一种方法可以用更简单的代码执行以下指令:(C++)
if(a > b && a > c && a > d)
能不能换成这样:
if(a > b, c, d)
使用 <algorithm>
header 中的 std::max(std::initializer_list<T>)
,如下所示:
#include <iostream>
#include <algorithm>
int main()
{
if(4 > std::max({2,3,6}))
std::cout << "greater\n";
else
std::cout << "not greater\n";
}
一种使其更简单的方法是将值放入数组中并对其进行排序。由于您没有给出具体示例,我不能说它是否对您的情况有帮助,但是当您处理排序数组时,您可以执行以下操作:
int i = 0;
while ((a < array[i]) && (i < kMaxElements))
{
i++;
}
最后,i
要么等于 kMaxElements
,要么是等于或大于 a
的项目的索引。
更好的是,您可以对数组进行二进制搜索以查找特定元素。在 C++ 中,<algorithm>
tools. See specifically, binary_search()
, lower_bound()
, and upper_bound()
.
中有针对此的特定算法
当您编写代码 if(a > b, c, d)
时,您使用的是 comma operator(而您不想)。
我不明白你到底在问什么。在所有情况下,计算机(有时)都必须进行三次比较。为什么你不能把它们都拼出来?
您或许可以使用花哨的 preprocessor 技巧,但在您的特定情况下,您不应该这样做。
当然,if
的测试可能是一个需要几行的长表达式。写类似
的东西是可以接受的并且很常见
if (a > b
&& a > c
&& a > d
&& somelongandcomplexcondition(a,b,c)
&& a*a > 34)
注意 正在计算最大值。您可能不想这样做,特别是如果 b
和 c
是具有副作用的长而复杂的子表达式。
想想像 if (c > 1 && a > 1 && a > b && a > b/c)
这样的测试的例子;您依赖 &&
的惰性 "and then" 求值来避免被零除。
如果您想了解更多 C11, see some C reference and refer to its standard n1570。
如果您想了解更多 C++11, see some C++ reference and refer to its standard n3337 (or some other, younger standard like C++17).
C 和 C++ 都精确定义了 if
语句可以是什么。
不要混淆 C 和 C++,它们是 不同的 编程语言,并且都在其标准规范中指定。一些编译器,特别是 GCC, provide extensions 给他们。您有责任决定使用特定于编译器的扩展或坚持语言标准(并希望您的代码可以被许多遵守该标准的编译器编译)。
在某些特定情况下,您的测试(或您的 C 或 C++ 代码)太长且重复性太强,以至于您可以考虑针对此类特定情况使用一些 metaprogramming approach: you'll then write some script (or some metaprogram) to emit C (or C++) code in a file (and you could later compile that generated file, or #include
it, etc.). There are several examples of C or C++ code generators (e.g. bison, SWIG, etc...) that might inspire you. You could also use some generic preprocessor like GPP or m4, or have your awk or python script (or your other C++ program) generate some C or C++ file, etc... Of course, you will configure your build automation (e.g. your Makefile
)。
我想知道(只是为了知道)是否有一种方法可以用更简单的代码执行以下指令:(C++)
if(a > b && a > c && a > d)
能不能换成这样:
if(a > b, c, d)
使用 <algorithm>
header 中的 std::max(std::initializer_list<T>)
,如下所示:
#include <iostream>
#include <algorithm>
int main()
{
if(4 > std::max({2,3,6}))
std::cout << "greater\n";
else
std::cout << "not greater\n";
}
一种使其更简单的方法是将值放入数组中并对其进行排序。由于您没有给出具体示例,我不能说它是否对您的情况有帮助,但是当您处理排序数组时,您可以执行以下操作:
int i = 0;
while ((a < array[i]) && (i < kMaxElements))
{
i++;
}
最后,i
要么等于 kMaxElements
,要么是等于或大于 a
的项目的索引。
更好的是,您可以对数组进行二进制搜索以查找特定元素。在 C++ 中,<algorithm>
tools. See specifically, binary_search()
, lower_bound()
, and upper_bound()
.
当您编写代码 if(a > b, c, d)
时,您使用的是 comma operator(而您不想)。
我不明白你到底在问什么。在所有情况下,计算机(有时)都必须进行三次比较。为什么你不能把它们都拼出来?
您或许可以使用花哨的 preprocessor 技巧,但在您的特定情况下,您不应该这样做。
当然,if
的测试可能是一个需要几行的长表达式。写类似
if (a > b
&& a > c
&& a > d
&& somelongandcomplexcondition(a,b,c)
&& a*a > 34)
注意 b
和 c
是具有副作用的长而复杂的子表达式。
想想像 if (c > 1 && a > 1 && a > b && a > b/c)
这样的测试的例子;您依赖 &&
的惰性 "and then" 求值来避免被零除。
如果您想了解更多 C11, see some C reference and refer to its standard n1570。
如果您想了解更多 C++11, see some C++ reference and refer to its standard n3337 (or some other, younger standard like C++17).
C 和 C++ 都精确定义了 if
语句可以是什么。
不要混淆 C 和 C++,它们是 不同的 编程语言,并且都在其标准规范中指定。一些编译器,特别是 GCC, provide extensions 给他们。您有责任决定使用特定于编译器的扩展或坚持语言标准(并希望您的代码可以被许多遵守该标准的编译器编译)。
在某些特定情况下,您的测试(或您的 C 或 C++ 代码)太长且重复性太强,以至于您可以考虑针对此类特定情况使用一些 metaprogramming approach: you'll then write some script (or some metaprogram) to emit C (or C++) code in a file (and you could later compile that generated file, or #include
it, etc.). There are several examples of C or C++ code generators (e.g. bison, SWIG, etc...) that might inspire you. You could also use some generic preprocessor like GPP or m4, or have your awk or python script (or your other C++ program) generate some C or C++ file, etc... Of course, you will configure your build automation (e.g. your Makefile
)。