C 如何将布尔条件的未计算表达式传递给函数?
我在下面编写的代码会重复3次:C 如何将布尔条件的未计算表达式传递给函数?,c,function,arguments,parameter-passing,dry,C,Function,Arguments,Parameter Passing,Dry,我在下面编写的代码会重复3次: int foo = 3; while (foo < 10) { printf("Hi!"); foo++; } foo = 12; while (foo % 8 != 0) { printf("Hi!"); foo++; } foo = 25 while (foo <= 38) { printf("Hi!"); foo++; } 这可以简化为功能条foo,条件;此函数如下所示: while (foo &
int foo = 3;
while (foo < 10) {
printf("Hi!");
foo++;
}
foo = 12;
while (foo % 8 != 0) {
printf("Hi!");
foo++;
}
foo = 25
while (foo <= 38) {
printf("Hi!");
foo++;
}
这可以简化为功能条foo,条件;此函数如下所示:
while (foo <= 38) {
printf("Hi!");
foo++;
}
我会这样称呼它:
print_hi(3, foo < 10);
print_hi(12, foo % 8 != 0);
print_hi(25, foo <= 38);
如何将布尔条件传递给函数
另外,代码可以使用函数指针。将该条件形成一个函数
bool f_lt(int a, int b) {
return (a < b);
}
bool f_rem(int a, int b); // definition left for OP
bool f_le(int a, int b); // definition left for OP
void print_hi(int foo, int bar, bool (*condition)(int, int));
while(condition(foo, bar)){
printf("Hi!");
foo++;
}
}
如何将布尔条件传递给函数
另外,代码可以使用函数指针。将该条件形成一个函数
bool f_lt(int a, int b) {
return (a < b);
}
bool f_rem(int a, int b); // definition left for OP
bool f_le(int a, int b); // definition left for OP
void print_hi(int foo, int bar, bool (*condition)(int, int));
while(condition(foo, bar)){
printf("Hi!");
foo++;
}
}
与chux的答案类似的解决方案,只是语法可能更接近问题中所要求的形式 它是如何工作的: EXPR是一个具有两个参数的宏。第一个参数是函数指针的名称。第二个是要计算的表达式。该函数只执行表达式并返回bool结果,而不执行其他操作
#include <stdio.h>
#include <stdbool.h>
#define EXPR(a, b) bool (a)(int foo) { return (b); }
void print_hi(int foo, bool (*expr_ptr)(int)) {
while (expr_ptr(foo)) {
printf("Hi!");
foo++;
}
}
EXPR(expr1, foo < 10)
EXPR(expr2, foo % 8 != 0)
EXPR(expr3, foo <= 38)
int main(void) {
print_hi(3, expr1);
print_hi(12, expr2);
print_hi(25, expr3);
return 0;
}
与chux的答案类似的解决方案,只是语法可能更接近问题中所要求的形式 它是如何工作的: EXPR是一个具有两个参数的宏。第一个参数是函数指针的名称。第二个是要计算的表达式。该函数只执行表达式并返回bool结果,而不执行其他操作
#include <stdio.h>
#include <stdbool.h>
#define EXPR(a, b) bool (a)(int foo) { return (b); }
void print_hi(int foo, bool (*expr_ptr)(int)) {
while (expr_ptr(foo)) {
printf("Hi!");
foo++;
}
}
EXPR(expr1, foo < 10)
EXPR(expr2, foo % 8 != 0)
EXPR(expr3, foo <= 38)
int main(void) {
print_hi(3, expr1);
print_hi(12, expr2);
print_hi(25, expr3);
return 0;
}
如何将布尔条件传递给函数
本例中的问题是,它不仅仅是一个布尔条件。每次迭代后,需要在函数内部验证产生布尔值的给定表达式
不能将未计算的表达式传递给函数
bool f_lt(int a, int b) {
return (a < b);
}
bool f_rem(int a, int b); // definition left for OP
bool f_le(int a, int b); // definition left for OP
void print_hi(int foo, int bar, bool (*condition)(int, int));
while(condition(foo, bar)){
printf("Hi!");
foo++;
}
}
如果布尔表达式是常量,并且仅限于示例中提供的三个表达式,并且您明确希望在函数调用中使用该表达式以保持可读性,则可以使用字符串文本并在函数内部比较字符串文本作为替代。请注意,需要将表达式括起来,如本例中的exp:
#include <stdio.h>
#include <string.h>
void print_hi(int, const char const *);
int main(void)
{
print_hi(3, "val < 10");
print_hi(12, "val % 8 != 0");
print_hi(25, "val <= 38");
return 0;
}
void print_hi(int val, const char const * str)
{
int exp = 0;
if(strcmp(str, "val < 10") == 0);
{
exp = 1;
}
else if(strcmp(str, "val % 8 != 0") == 0);
{
exp = 2;
}
else if(strcmp(str, "val <= 38") == 0)
{
exp = 3;
}
else
return;
switch(exp)
{
case 1:
while (val < 10)
{
printf("Hi!");
val++;
}
break;
case 2:
while (val % 8 != 0)
{
printf("Hi!");
val++;
}
break;
case 3:
while (val <= 38) {
printf("Hi!");
val++;
}
break;
default:
break;
}
return;
}
或者,您也可以使用一个值作为替代,并在函数内部根据该值确定路径:
#include <stdio.h>
void print_hi(int, unsigned short int);
int main(void)
{
print_hi(3,1);
print_hi(12,2);
print_hi(25,3);
return 0;
}
void print_hi(int val, unsigned short int exp)
{
switch(exp)
{
case 1:
while (val < 10)
{
printf("Hi!");
val++;
}
break;
case 2:
while (val % 8 != 0)
{
printf("Hi!");
val++;
}
break;
case 3:
while (val <= 38) {
printf("Hi!");
val++;
}
break;
default:
break;
}
return;
}
如何将布尔条件传递给函数
本例中的问题是,它不仅仅是一个布尔条件。每次迭代后,需要在函数内部验证产生布尔值的给定表达式
不能将未计算的表达式传递给函数
bool f_lt(int a, int b) {
return (a < b);
}
bool f_rem(int a, int b); // definition left for OP
bool f_le(int a, int b); // definition left for OP
void print_hi(int foo, int bar, bool (*condition)(int, int));
while(condition(foo, bar)){
printf("Hi!");
foo++;
}
}
如果布尔表达式是常量,并且仅限于示例中提供的三个表达式,并且您明确希望在函数调用中使用该表达式以保持可读性,则可以使用字符串文本并在函数内部比较字符串文本作为替代。请注意,需要将表达式括起来,如本例中的exp:
#include <stdio.h>
#include <string.h>
void print_hi(int, const char const *);
int main(void)
{
print_hi(3, "val < 10");
print_hi(12, "val % 8 != 0");
print_hi(25, "val <= 38");
return 0;
}
void print_hi(int val, const char const * str)
{
int exp = 0;
if(strcmp(str, "val < 10") == 0);
{
exp = 1;
}
else if(strcmp(str, "val % 8 != 0") == 0);
{
exp = 2;
}
else if(strcmp(str, "val <= 38") == 0)
{
exp = 3;
}
else
return;
switch(exp)
{
case 1:
while (val < 10)
{
printf("Hi!");
val++;
}
break;
case 2:
while (val % 8 != 0)
{
printf("Hi!");
val++;
}
break;
case 3:
while (val <= 38) {
printf("Hi!");
val++;
}
break;
default:
break;
}
return;
}
或者,您也可以使用一个值作为替代,并在函数内部根据该值确定路径:
#include <stdio.h>
void print_hi(int, unsigned short int);
int main(void)
{
print_hi(3,1);
print_hi(12,2);
print_hi(25,3);
return 0;
}
void print_hi(int val, unsigned short int exp)
{
switch(exp)
{
case 1:
while (val < 10)
{
printf("Hi!");
val++;
}
break;
case 2:
while (val % 8 != 0)
{
printf("Hi!");
val++;
}
break;
case 3:
while (val <= 38) {
printf("Hi!");
val++;
}
break;
default:
break;
}
return;
}