在c中的顺序求值中执行for循环

在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循环 编辑: 我决定更新我的问题,以

我试图在C中使用顺序求值运算符(
),我想在第一个表达式中执行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() ) ;
}