Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将布尔条件的未计算表达式传递给函数?_C_Function_Arguments_Parameter Passing_Dry - Fatal编程技术网

C 如何将布尔条件的未计算表达式传递给函数?

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 &

我在下面编写的代码会重复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 <= 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;
}