【问题标题】:Redefinition of Assignment Operator赋值运算符的重新定义
【发布时间】:2014-04-16 03:59:00
【问题描述】:

据我了解,有几种语言使用:= 作为赋值运算符。这样做是为了避免与== 运算符混淆。这对我来说似乎是一个非常有效的观点,所以我正在考虑如何用 C 之类的语言来实现它。这就是我的想法。

#define := =
// ... later on

int x := 4;

虽然这会起作用(如果预处理器支持该语法),它仍然允许我使用= 运算符。所以我的问题是,有没有办法“标记”符号或运算符/有没有办法阻止使用某些已定义的运算符或符号?再次,这就是我的想法,但是我不知道这在句法/语义上的合法性。

#undef =

【问题讨论】:

  • 不要。只是不要....
  • 运算符不是 C 中的标识符,它们是保留字。这不应该工作,感谢上帝。要使其正常工作,您至少需要编写自己的预处理器。
  • 你是对的。众所周知,即使是非常有经验的 C 编码人员也会陷入 =/== 问题。我同意@MitchWheat 的观点,即按照您的建议去做不是一个好主意;主要是因为它使下一个人很难尝试维护代码。相反,我采取了不同的方法。例如,当我与常数进行比较时,我总是将常数放在首位。即:if(4 == x)... 而不是 if(x == 4)。如果我写错了 if(4 = x),编译器会报错。
  • 顺便说一句,编译器通常会抱怨 if(x=4); 语句。由于这是一个常见的错误[为了消除编译器的抱怨,你必须把它写成:if((x=4))]。

标签: c operators c-preprocessor operator-keyword


【解决方案1】:
#define := =

宏名只能是标识符。如果任何 C 编译器接受该定义,我会感到非常惊讶。原则上,编译器可以接受它作为语言扩展,但例如 gcc 就不能。任何符合标准的 C 编译器都必须至少发出诊断。

你说它有效;坦率地说,我持怀疑态度。你用的是什么编译器?

#undef =

同样的问题。

我可以看到(甚至同意)您的观点,即使用:= 而不是= 作为赋值运算符会是一个更好的主意。但是使用预处理器来改变这样的语言,即使在它可以工作的情况下,也不是一个好主意。

C 程序员知道= 表示赋值。阅读您的代码的任何人都可能会猜到 :=意味着赋值,但这只会使您的代码更难阅读。

【讨论】:

    【解决方案2】:

    标准 C 不允许未定义或更改“=”赋值运算符。但是,有几个 C 编译器的源代码是可用的;欢迎您对 C 编译器的构建进行自己的修改。包括将 '=' 更改为 ':='。祝你好运!

    【讨论】:

      【解决方案3】:

      好问题,但不要那样做。您的方法导致可读性差。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-21
        • 1970-01-01
        • 2014-05-18
        • 2012-07-30
        • 2013-03-30
        • 2013-02-14
        相关资源
        最近更新 更多