我希望我能做这样的事情:
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牧师。
5条答案
按热度按时间7bsow1i61#
首先,我怎么强调都不为过:使用类似函数的宏来创建自己的秘密、私有语言是C语言的一项重罪。这可能是您所能做的最糟糕的事情。
为什么呢?因为阅读你代码的人应该知道C语言,但是他们不应该知道你的秘密宏语言,而且他们对学习你的秘密宏语言完全没有兴趣。
所以千万不要在真实的程序中做这样的事情。
话虽如此,你几乎已经回答了自己的问题:
注意,
condition
是一个类似函数的宏参数,应该放在一个圆括号内。这可以防止意外的运算符优先错误。例如,如果调用者传递until(i + 1)
,那么你希望它循环while(!(i+1))
,而不是 *while(!i + 1)
。rjee0c152#
从 * MavenC编程 *:
宏的使用最好限于命名文字常量,一些精心选择的结构的简写。定义宏名时全部用大写字母,这样在使用时,它就可以立即清楚地表明它不是一个函数调用。避免使用任何修改底层语言的C预处理器,这样它就不再是C了。
不,这会让人更加困惑,因为关键字
until
不是C
的一部分。键入一些额外的字符并不需要太多。话虽如此,你可以做:
使用以下内容编译程序:
查看预处理器做了哪些更改。
但这仍然是一件令人憎恶的事,一件人们不会宽恕的事。
btxsgosb3#
使用
until
在某些情况下很有用。有时候,算法或软件契约在其定义中使用 until,所以在代码中看到这种匹配是很好的。
然而重写语言语义增加了混乱和维护成本。
当需要 until 时,考虑使用 comment。
mtb9vblg4#
是的,您可以使用
define
来完成此操作。有关宏定义,请参见以下示例如果运行它,则输出为
rsaldnfx5#
我不知道你为什么要这么做,
until
是一个几乎被抛弃的关键词,但这应该是可行的: