在c中的顺序求值中执行for循环
我试图在C中使用顺序求值运算符(在c中的顺序求值中执行for循环,c,for-loop,comma-operator,C,For Loop,Comma Operator,我试图在C中使用顺序求值运算符(,),我想在第一个表达式中执行for循环,如下所示: ( for(initialization;condition;increment) foo() , bar() ) 但是写这行代码时,我得到了一个错误:expected expression 如果发现这是一件不可能做到的事情,我不会感到惊讶,尽管让我感到不安的是,我可以以logical\u表达式的形式执行伪if语句?表达式为真:表达式为假 有办法吗?还是需要在外部创建for循环 编辑: 我决定更新我的问题,以
,
),我想在第一个表达式中执行for循环,如下所示:
( for(initialization;condition;increment) foo() , bar() )
但是写这行代码时,我得到了一个错误:expected expression
如果发现这是一件不可能做到的事情,我不会感到惊讶,尽管让我感到不安的是,我可以以logical\u表达式的形式执行伪if语句?表达式为真:表达式为假
有办法吗?还是需要在外部创建for循环
编辑:
我决定更新我的问题,以提供更多关于我的问题的背景
我有两个函数,让我们称它们为baz()
和qux()
qux()
是baz()
的反函数,因此对于任何给定的输入,qux(baz(输入))
应该返回输入
具体来说,baz()
获取一个字符数组,所有字符都在'0'
和'9'
之间,并以与此问题无关的不同格式返回该数字的表示形式。当我们将不同的表示形式传递给quz()
时,我们将返回原始数组
因此,我想构建自己的代码来测试任意数量的案例,看看qux(baz(input))
是否返回了所需的结果。我想用尽可能少的代码行来实现这一点(我不想把所有的代码行放在同一行中,用分号分隔)
我知道我可以使用像CUnit这样的框架来做,但我想自己做。我知道以这种方式编写代码会使代码变得不可读和混乱,但我想把它作为个人的挑战。所以我写了(不要试图理解它,它几乎是不可读的代码):
#包括“my_lib.h”
#包括
#包括
int main(){
int i,错误大小=0,str大小=1;
char*str,**错误=NULL;
(str=malloc(sizeof(*str)*2),str[0]='1',str[1]='\0');
对于((i=0);i<10000;(i++),(str[str_size-1]='9')?(str[str_size-2]='9'?str[str_size-1]='0',str_size++,str=realloc(str,sizeof(*str str)str_size+1)),str[str_size-1]='0',str str[str_size]='0':str[str[str[str_size-2]+,str[str_size-1]='0'):(str[str[str[str_size-2]+,str size-1],[str size-1]='0'):(str+str(str+str)(str+str)(str+str-str,str)==0?(printf(“pass\n”),NULL:(printf(“FAIL,got%s\n”),qux(baz(str)),errors\u size++,errors=realloc(errors,sizeof(*errors)*errors\u size-1]=malloc(sizeof(*str)*(str size+1)),memcpy(errors[errors\u size-1],str,sizeof(*str str size+1));
对于((printf(“\n\n错误摘要:\n\n尝试了%d个案例,发现了%d个错误(%f%%)\n\n”,i,错误大小,100.0*((float)错误大小/(float)i)),i=0;i<((错误大小<100)?错误大小:1);i++((错误大小<100)?(printf(%d.\t%s\t-->%s\t-->%s\n),i,错误大小,qux(错误[i]):(printf要显示的案例数量太多)。\n;
返回0;}
这仅仅是7行代码,主要部分只在其中的两行中执行。我尝试构建一个从'1'
开始的字符串,并为每个步骤递增它。然而,当我达到999这样的数字时,我必须将其全部设置回零,并在开始处加1。我能想到的唯一方法就是使用for循环
一种可能的解决方案是创建一个递增
str
的函数,但这意味着要编写额外的代码行,这不是我的挑战的最佳解决方案。您可能在实际代码中缺少分号,但在语句中使用逗号运算符非常好,例如:
for(int i = 0; i < 10; i++) printf("%d", i), printf(" Hello\n");
for(inti=0;i<10;i++)printf(“%d”,i),printf(“Hello\n”);
您只能在表达式周围放置括号关键字构造,如的
不算作表达式
正如@mnistic所建议的,您可以写:
for(initialization;condition;increment) foo() , bar();
没有最外层的排列。但不能将排列放在循环的周围。
这么做有什么不对
for(initialization;condition;increment) foo();
bar();
你为什么要用逗号?你想得太多了。语句是按顺序求值的,因此根据您的示例,您可以按如下方式进行求值:
for(initialization;condition;increment)
foo();
bar();
如果对bar
的调用是某个更大表达式的一部分,则该表达式位于bar()处代码>在上面,而for
循环在前面
如果这仍然不是你想要的,那么你需要给我们更多的上下文来了解你在做什么,以及为什么你认为你需要一个像你建议的那样的结构。这篇文章的许多好答案都涵盖了语句和表达式之间的区别。希望强调几个替代方案,这些替代方案可以实现将for语句转换为表达式的等效功能
一些注意事项:
这不是标准的“C”-它使用的是GCC扩展。。如果构建要求严格遵守标准,则可能必须在构建中启用这些功能
OP没有提供具体的案例,因此很难判断是否有其他具体的替代方案
选项1-作为表达式的语句
见:
选项2-使用嵌套函数
见:
嵌套函数foo_loop可以访问局部变量
选项3-使用函数调用
OP不清楚什么是循环依赖项。如果很简单(例如,循环N次),可以使用辅助函数
void foo_loop(int n) {
for (int i=0 ; i<n ; i++) foo() ;
}
int func(void)
{
// Execute the loop in the function
int n = 50 ;
( foo_loop(n), bar() ) ;
}
void foo_循环(int n){
对于(inti=0;iNo),我的意思是:我在这里做一个顺序求值。所以你的代码应该是:(对于(inti=0;i<10;i++)printf(“%d”,i),printf(“Hello\n”);
,它不编译。(正如我在问题中指出的,我得到了错误:预期表达式
)。你认为呢
int func(void)
{
// Execute the loop as expression
({ for (...) foo() ; bar() }) ;
}
int func(void)
{
void foo_loop(void) {
for (...) foo() ;
}
// Execute the loop as expression
( foo_loop(), bar() ) ;
}
void foo_loop(int n) {
for (int i=0 ; i<n ; i++) foo() ;
}
int func(void)
{
// Execute the loop in the function
int n = 50 ;
( foo_loop(n), bar() ) ;
}