C – 我可以定义自定义的真/假值吗?



您好,我想定义一些自定义语句。例如,在波兰语中,我们有字母"a"而不是"ą"和"b",我想做这样的事情

#define a > b && ą > b

我需要这个来比较 if 语句来对单词进行排序,所以这应该像

if(ą > a) //false from define 

不,你不能那样做。您必须使用(内联)函数或宏等函数来执行此操作。如果是用于排序,您应该记住,这将基于字符的整数表示进行排序,这不一定是按字母顺序排列的。

你对一种编程语言有一种直觉,你可以定义一些事实,并在以后以直接的方式使用它们。这是一种比直接用 C 语言编写的更抽象的表达方式。您正在寻找的编程语言很可能是Mathematica。您可以使用其符号规则替换来建立将抽象集合元素ą排序在a之后的规则,然后使用这些规则来获取有关各种元素的相对顺序的语句,即使在更复杂的表达式中也是如此(您可以定义字符连接等 - 所有这些都是抽象的,以及数学家会如何思考它, 而不是 C 让你直接表达的内容)。或者你可以使用Mathematica庞大的事实库,例如Alphabet["Polish"]将波兰小写字母作为列表返回:{"a", "ą", "b", "c", "ć", …, "ż" }- 这可用于建立排序顺序。

如果你想在 C 中执行此操作,那么:

  1. 这些字符在波兰语区域设置中已具有正确的排序规则顺序。如果您的系统设置为波兰语区域设置,则这种情况已经发生。

  2. 要比较字符,不能使用普通的 C 比较运算符,因为这些运算符比较字符的数值,而这些数值与排序顺序没有太大关系。使用 C 的strcoll函数来比较字符串(如果您愿意,可以是单字符字符串!

当然,您可以自己编写一个半生不熟的strcoll,一个简单的方法可能是:

#include <assert.h>
#include <wchar.h>
int wcharpos_pl(wchar_t ch) {
static const wchar_t alphabet[] = 
L"AĄBCĆDEĘFGHIJKLŁMNŃOÓPQRSŚTUVWXYZŹŻaąbcćdeęfghijklłmnńoópqrsśtuvwxyzźż";
enum { alphabet_size = sizeof(alphabet) / sizeof(alphabet[0]) };
for (int i = 0; i < alphabet_size; ++i)
if (alphabet[i] == ch) return i;
return alphabet_size + (int)ch; // fall back to numerical order outside of the alphabet
}
int wstrcoll_pl(const wchar_t *left, const wchar_t *right) {
while (*left == *right && *left) { // step through strings as long as they are equal
++left;
++right;
}
const int l = wcharpos_pl(*left), r = wcharpos_pl(*right);
if (l < r) return -1;
if (l > r) return 1;
return 0;
}
int main() {
assert(wstrcoll_pl(L"koktajl", L"koktajl") == 0);
assert(wstrcoll_pl(L"Abrakadabra", L"abrakadabra") < 0);
assert(wstrcoll_pl(L"matwa", L"mątwa") < 0);
assert(wstrcoll_pl(L"żurawina", L"źrebak") > 0);
assert(wstrcoll_pl(L"Żur", L"Żurawina") < 0);
assert(wstrcoll_pl(L"ŻURAWINA", L"ŹREBAK") > 0);
assert(wstrcoll_pl(L"źdźbło", L"ździebko") > 0);
}

最新更新