在C中定义自定义语法“until

kxe2p93d  于 2023-01-08  发布在  其他
关注(0)|答案(5)|浏览(247)

我希望我能做这样的事情:

int i = 0;
until (i == 2){
  printf("yes\n");
  i++;
}

在不详细说明until的作用的情况下,我相信读者已经从上面的代码中知道了算法是什么。是的,我知道我可以直接使用while(!condition){}
输出将为:

yes
yes

那么我有可能实现我的目标吗?
我觉得宏可以用define或其他东西来做这件事。但是我缺乏C语言中预处理指令语法的知识

#define until <what should I fill here>

编辑:很多人都是因为我在做什么而被触发的。如果我打扰了你们,我很抱歉。不用担心,这个语法只是为我自己准备的。所以我希望我不会打扰那些不小心读到我代码的代码阅读者或者C牧师。

7bsow1i6

7bsow1i61#

首先,我怎么强调都不为过:使用类似函数的宏来创建自己的秘密、私有语言是C语言的一项重罪。这可能是您所能做的最糟糕的事情。
为什么呢?因为阅读你代码的人应该知道C语言,但是他们不应该知道你的秘密宏语言,而且他们对学习你的秘密宏语言完全没有兴趣。
所以千万不要在真实的程序中做这样的事情。
话虽如此,你几乎已经回答了自己的问题:

#define until(condition) while(!(condition))

注意,condition是一个类似函数的宏参数,应该放在一个圆括号内。这可以防止意外的运算符优先错误。例如,如果调用者传递until(i + 1),那么你希望它循环while(!(i+1)),而不是 * while(!i + 1)

rjee0c15

rjee0c152#

从 * MavenC编程 *:
宏的使用最好限于命名文字常量,一些精心选择的结构的简写。定义宏名时全部用大写字母,这样在使用时,它就可以立即清楚地表明它不是一个函数调用。避免使用任何修改底层语言的C预处理器,这样它就不再是C了。

  • 回复:“我相信读者知道上面代码中的算法是什么。"*

不,这会让人更加困惑,因为关键字until不是C的一部分。键入一些额外的字符并不需要太多。
话虽如此,你可以做:

#define until(condition) while(!(condition))

使用以下内容编译程序:

gcc -E -nostdinc main.c

查看预处理器做了哪些更改。
但这仍然是一件令人憎恶的事,一件人们不会宽恕的事。

btxsgosb

btxsgosb3#

使用until在某些情况下很有用。

有时候,算法或软件契约在其定义中使用 until,所以在代码中看到这种匹配是很好的。
然而重写语言语义增加了混乱和维护成本。
当需要 until 时,考虑使用 comment

int i = 0;

// until (i == 2) {
while (i != 2) {
  printf("yes\n");
  i++;
}
mtb9vblg

mtb9vblg4#

是的,您可以使用define来完成此操作。有关宏定义,请参见以下示例

#include <stdio.h>

#define until(x) while(!(x))

int main() {
   int i = 0;
   until (i == 2){
     printf("iteration %d\n", i);
     i++;
   }
   return 0;
}

如果运行它,则输出为

iteration 0
iteration 1
rsaldnfx

rsaldnfx5#

我不知道你为什么要这么做,until是一个几乎被抛弃的关键词,但这应该是可行的:

#define until(cond) while (!(cond))

相关问题