【发布时间】:2020-04-09 12:27:00
【问题描述】:
我正在尝试在 C 中使用顺序求值运算符 (,),并且我想在第一个表达式中执行 for 循环,如下所示:
( for(initialization;condition;increment) foo() , bar() )
但是写那行我得到一个error: expected expression。
我不会惊讶地发现这是一件不可能的事情,尽管让我犹豫不决的是我可以执行 logical_expression ? expression_true : expression_false 形式的伪 if 语句。
有没有办法做到这一点?还是我需要在外部创建 for 循环?
编辑:
我决定更新我的问题以提供有关我的问题的更多背景信息。
我有两个函数,我们称它们为baz() 和qux()。 qux() 是 baz() 的反函数,因此对于任何给定的输入,qux(baz(input)) 应该返回输入。
具体来说,baz() 接受一个字符数组,它们都在'0' 和'9' 之间,并以与该问题无关的不同格式返回该数字的表示。当我们将不同的表示传递给quz() 时,我们会返回原始数组。
所以我想构建自己的代码来测试任意数量的案例,看看qux(baz(input)) 是否返回了所需的结果。我想在尽可能少的代码行中做到这一点(只是将所有行放在同一个行中,用分号分隔,这不是我想要的)。
我知道我可以使用像 CUnit 这样的框架来完成它,但我想自己完成它。而且我知道以这种方式编写我的代码会使其不可读和混淆,但我想将其作为个人挑战。所以我写了(不要试图理解它,它几乎是不可读的代码):
#include "my_lib.h"
#include <stdlib.h>
#include <stdio.h>
int main() {
int i, errors_size = 0, str_size = 1;
char *str, **errors = NULL;
(str = malloc(sizeof(*str)*2) , str[0] = '1' , str[1] = '\0');
for( (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_size+1)), str[str_size- 1] = '0', str[str_size] = '\0' : str[str_size-2]++ , str[str_size-1] = '0' ) ) : ( str[str_size-1]++ ) ) ) ( printf("Trying %s:",str) , (strcmp(qux(baz(str)) , str) == 0) ? ( printf(" pass\n") , NULL ) : ( printf(" FAIL, got %s\n",qux(baz(str))) , errors_size++ , errors = realloc(errors, sizeof(*errors)*errors_size ) , errors[errors_size-1] = malloc( sizeof(*str)*(str_size+1) ) , memcpy(errors[errors_size-1] , str , sizeof(*str)*(str_size+1)) ) );
for ( ( printf("\n\nERROR SUMMARY:\n\nTried %d cases. %d errors found (%f%%)\n\n",i,errors_size,100.0*(((float)errors_size)/((float)i))) , i = 0 ) ; i < ( (errors_size < 100) ? errors_size : 1) ; i++ ) ( (errors_size < 100) ? (printf("%d.\t%s\t--> %s\n",i,errors[i],qux(baz(errors[i])))) : ( printf("The amount of cases to show is too big.\n") ) );
return 0; }
这只有 7 行代码,主要部分仅在其中两行中执行。我尝试构建一串以'1' 开头的字符,并为每一步递增。但是,当我达到 999 之类的数字时,我必须将其全部设置为零并在开头添加 1。我能想到的唯一方法是使用 for 循环。
一种可能的解决方案是创建一个函数来增加str,但这意味着要编写额外的代码行,这不是我所面临挑战的最佳解决方案。
【问题讨论】:
-
for循环不在括号内。它们是语句,不能在表达式中使用。删除for循环周围的括号。如果, bar()应该是独立的,而不是for的一部分,则将其设为; bar();。 -
嗯,这正是我的问题所在。在我自己的 C 代码中,我需要在顺序评估中包含一个 for 循环,否则我将不得不全部重写。有没有办法做到这一点?即使不使用 for 循环本身,而是使用替代解决方案来保持顺序评估结构完整?
-
请说明您打算将
bar放在循环内部还是外部 -
如果你想尽量减少代码行,只需将所有语句放在一行。 C 中没有规定分号后面必须跟换行符。
-
代码高尔夫和混淆并不是这个网站的最佳选择。此类问题应在Code golf 提出。 “与解决编程难题或特定类型的挑战相关的非挑战问题也是主题。”
标签: c for-loop comma-operator