【问题标题】:What is '\0' in C++?C++ 中的“\0”是什么?
【发布时间】:2011-03-26 07:30:56
【问题描述】:

我正在尝试将一个大型项目从 C++ 转换为 Delphi,并且我正在完成翻译。我留下的东西之一是 '\0' 怪物。

if (*asmcmd=='\0' || *asmcmd==';')

asmcmd 是 char*。

我知道 \0 标志着 C++ 中数组类型的结束,但我需要知道它是一个字节。是0吗?

换句话说,下面的代码是否等同于 C++ 行?

if(asmcmd^=0) or (asmcmd^=';') then ...

其中 asmcmd 是 PAnsiChar。

你不需要知道 Delphi 来回答我的问题,但告诉我 \0 作为字节。那也行。 :)

【问题讨论】:

    标签: c++ delphi operators translation


    【解决方案1】:

    这是nullchar0 的字符。它用于字符串的末尾。

    【讨论】:

    • 所以我想它是 0。谢谢!
    • \0 不是null 而是NUL :) 前者是指针,后者是字符。
    • ...还有旧的“空指针可能不在地址 0”的东西:stackoverflow.com/questions/2759845/…
    • 没有任何代码格式的null这个词只是一个普通的英文单词,在谈论字符0时完全可以接受。它是空字符,它的ASCII名称为 NUL。同样,值为 2 的字符是文本开头字符,其名称为 STX。
    【解决方案2】:

    '\0' 等于 0。它是来自 C 的遗物,它根本没有任何字符串类型,而是使用 char 数组。空字符用于标记字符串的结束;回想起来,这不是一个非常明智的决定——大多数其他字符串实现在某处使用专用的计数器变量,这使得找到字符串的结尾 O(1) 而不是 C 的 O(n)。

    *asmcmd=='\0' 只是在假设语言中检查length(asmcmd) == 0asmcmd.is_empty() 的一种复杂方式。

    【讨论】:

    • 很复杂,也许……但重要的是要知道何时应该使用'\0'。一个例子是for(char *c = str; *c != '\0'; c++)for (int i = 0; i < strlen(str); i++)。 (当然,根据您的应用程序,您可能会发现几乎不需要遍历字符串中的字符。)
    • @David: "*c != '\0'" 为什么不只是(char *c = str; *c; c++)
    • 取决于周围的代码,这并不意味着代码正在检查长度。更有可能是它想要在字符串的末尾停止,或者在这种情况下也是分号部分。
    • @SigTerm, David:是的,有充分的理由不删除多余的字符——可读性如何?我实际上会把它写成*c != END_OF_STRING;(其中END_OF_STRING 是const char)。学会敲打类型。只需 3 次击键。
    • @James Curran:这里没有过多煽风点火的意思,但我认为在可读性和惯用性之间需要做出重要的权衡。给'\0' 一个特殊的名称让人想起各种“框架”,它们对于所有标准整数类型等都有自己的typedef s。当采用这些编码标准时,如果项目足够大,足以保证强迫新人加入,这些编码标准就很好学习一些约定。但总的来说,可读性意味着按照人们习惯的方式做事。 OTOH,@SigTerm 的版本比我想要的更简洁,因此我的 != '\0'
    【解决方案3】:

    严格来说,它是八进制值为零的字符的转义序列(当然在任何基数中也是零)。

    尽管您可以使用任何以零为前缀的数字来指定八进制字符代码(例如,'\040' 是 ASCII 编码中的空格字符),但您很少有这样做的理由。 '\0' 是用于指定 NUL 字符的惯用语(因为您无法从键盘键入此类字符或将其显示在编辑器中)。

    您同样可以指定 '\x0',它是一个以十六进制表示的 NUL 字符。

    NUL 字符在 C 和 C++ 中用于终止存储在字符数组中的字符串。此表示用于文字字符串常量,并且按照惯例用于由<cstring>/<string.h>library 操作的字符串。在 C++ 中,可以使用 std::string 类。

    请注意,在 C++ 中,'\0''a' 等字符常量的类型为 char。在 C 语言中,可能出于晦涩的原因,它的类型为 int

    【讨论】:

    • 我会给 +1 只是因为说 NUL 而不是 null,但其余的也很好......
    猜你喜欢
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    相关资源
    最近更新 更多