【问题标题】:Does At symbol (@) and Dollar Sign ($) has any special meaning in C or C++At 符号 (@) 和美元符号 ($) 在 C 或 C++ 中是否有任何特殊含义
【发布时间】:2014-07-29 15:27:49
【问题描述】:

最近我的一位朋友在一次采访中遇到了这个问题。面试官问他$, @, |, ^, ~这样的特殊字符在c或c++中有没有用处,在哪里。

我知道|, ^ and ~分别用作按位或、异或和补码。

但是不知道@ and $有没有什么特殊含义。如果可以,请举例说明它可以应用在哪里?

【问题讨论】:

  • 你什么时候写你的电子邮件地址和你需要多少薪水?
  • 我很确定答案是它们没有任何特殊含义。
  • 不,既不是基本源字符集的一部分,也不是基本执行字符集。
  • @Arman 对于“特殊含义”的一些定义。它们在 cmets、字符串文字和字符文字之外是非法的。
  • 请注意,Microsoft 在库函数名称中使用 @,后跟一个数字,表示用于某些 32 位调用约定的输入参数的字节数,但这些“损坏”的名称仅在汇编代码中可见,而不是来自 C 或 C++ 代码。

标签: c++ c special-characters


【解决方案1】:

@在C语言中一般无效;它不用于任何事情。它被 Objective-C 用于各种目的,但那完全是另一回事。

$ 也是无效的,但许多实现允许它出现在标识符中,就像字母一样。 (例如,在这些实现中,您可以根据需要将变量或函数命名为 $$$。)尽管如此,它也没有任何特殊含义。

【讨论】:

  • 当然,如果一个实现决定不支持它,那么你的代码突然就不起作用了。
  • 不是名称 a-zA-z_0-9 的唯一有效字符吗?
  • 更正于$;忘了这是一个扩展。
  • @self.,或 universal-character-name\u\U),或其他实现定义的字符(例如 $)。
  • 请注意,@ 和 $ 对于运算符重载都无效,尽管您可能会以某种方式使用预处理器宏做坏事
【解决方案2】:

要完成已接受的答案,@ 可用于指定嵌入式系统上变量的绝对地址。

unsigned char buf[128]@0x2000;

注意这是一个非标准的编译器扩展。

查看一个很好的解释here

【讨论】:

  • 为什么?由于 C 无论如何都不进行编译时边界检查(即使可以),与 unsigned char *buf = 0x2000; 相比有什么优势?
  • @Muzer 至少对sizeof 有影响。然后根据您的编译器和使用的标志,您可以进行编译时或运行时边界检查。
【解决方案3】:

完成其他答案。 5.2.1.3 中的 C99 标准:

基本源和基本执行字符集都应具有 以下成员:

拉丁字母的26个大写字母

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

拉丁字母的26个小写字母

a b c d e f g h i j k l m n o p q r s t u v w x y z

十进制数字

0 1 2 3 4 5 6 7 8 9

以下29个图形字符

! " # % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ _ { | } ~

所有其他角色甚至可能都不存在。 (并且不应该使用)

但Common extensions中也有这一点:Annex J, J.5.2:

下划线_、字母和数字以外的字符,它们不属于基本 源字符集(例如美元符号 $,或国家字符集中的字符) 可能出现在标识符中 (6.4.2)。

这基本上是黄昏已经写的。

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    相关资源
    最近更新 更多