C – 我可以定义自定义 true/false 值吗?

C – Can I Define custom true/false values?

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

#define a > b && ą > b

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

if(ą > a) //false from define 

不,你不能那样做。您将不得不使用(内联)函数或类似宏的函数来做到这一点。如果是为了排序,你应该记住,这将基于字符的整数表示进行排序,这不一定是字母顺序。

您有一种编程语言的本能,您可以在其中定义一些事实并在以后以直接的方式使用它们。这是一种比直接用 C 语言编写的更抽象的表达方式。您正在寻找的编程语言很可能是 Mathematica。您可以使用它的符号规则替换来建立在 a 之后对抽象集合元素 ą 进行排序的规则,然后使用这些规则获得关于各种元素的相对顺序的陈述,即使是在更复杂的表达式中(您可以定义字符连接等 - 都是抽象的以及数学家会如何看待它,而不是 C 让您直接表达的内容)。或者您可以只使用 Mathematica 庞大的事实库,例如Alphabet["Polish"] returns 波兰语小写字母列表:{"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"[=10=]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);
}