C 对equal and运算符使用宏

C 对equal and运算符使用宏,c,C,最近我更新了自己的C语言。在一些博客中,我读到“==”和“&&&”等运算符会导致程序员分别使用“=”和“&”的错误,程序员花了很多时间来查找和解决问题 我认为为“==”和“&&&”定义宏将解决这个问题 #define EQ == #define AND && int main(void) { int a = 1 , b = 2 ; if(a EQ 1 AND b EQ 2 ){ // some statements } } 这

最近我更新了自己的C语言。在一些博客中,我读到“==”和“&&&”等运算符会导致程序员分别使用“=”和“&”的错误,程序员花了很多时间来查找和解决问题

我认为为“==”和“&&&”定义宏将解决这个问题

#define EQ ==
#define AND &&

int main(void) 
{
    int a = 1 , b = 2 ; 

    if(a EQ 1 AND b EQ 2 ){
        //  some statements
    }

}

这是否会影响可读性?有没有其他解决办法

不,这不是一个特别好的主意。这意味着任何有经验的C程序员在阅读您的代码之前,都必须先了解
EQ
的意思

当然,
==
可能容易出错,但我认为解决这个问题的最好办法是(a)在编译器中打开警告,以及(b)小心


(标准标题
提供了一个宏
,可扩展为
&&
,但它没有为
=
提供宏。
的目的是支持由于旧的国家变体字符集而难以使用某些字符的系统,而不是提供更可读的替代方案。)事实上,我认为这里没有问题。如果检测到可疑内容,任何现代编译器都会发出警告

那是个坏主意 最好的做法是编译时激活所有警告标志(-Wall),并确保可以编译没有警告的代码

和TDD。这更多的是关于语法的实践


我个人推荐《代码完成》一书,我不想触及语言的基本语法,比如创建宏来替换C关键字或运算符

在这种情况下,它非常简单,并且可能不会改变太多的可读性,但是看到这些宏的其他程序员(如果您不是唯一维护代码的人)可能会尝试为他们认为不明确或容易出错的其他内容创建其他宏

因此,我不支持C中关键字/运算符级别的宏。
但您可以使用一些编译器选项来显示何时存在歧义,如

  gcc -Wall prog.c -o prog
Wall
启用所有警告(您可以使用gcc优化警告)。这取决于您使用的编译器

比如说

  int a=1,b=2;
  if (a = b) { ... }

如果使用gcc作为编译器并带有
-Wall
选项,则会发出警告。

尝试重新定义C语言总是一个非常糟糕的主意。通过宏替换运算符将使其他C程序员无法读取代码

关于&&意外变成&,我怀疑这是一个问题,至少我从未遇到过这个问题。在标准C中已经有了可选的逻辑运算符,您应该使用它们

标题
定义了以下十一个宏(位于 左侧)扩展到相应的令牌(右侧):

危险的想法是一个非常过时的想法。在80年代,困惑的程序员发明了一些模糊的规则,比如“在进行比较时总是将文本放在变量前面”,即
if(0==var)

避免与此相关的错误的正确方法是避免在条件内部赋值。一旦您采用了这种良好的编码风格,就很容易避免此类错误。自从1990年发布Turbo C以来,发现它们就不是什么问题了。从那时起,当您在if语句中进行赋值时,几乎每个编译器都能够发出“可能不正确赋值”的警告

在现代编程中,所有专业程序员都使用静态分析器工具来发现各种编译时错误。如果您的编译器由于某种原因无法发现这个bug,那么静态分析器肯定会发现


因此,要回答您的问题:是的,它是杂乱无章的,使代码更容易出错,可读性更低。

解决此类问题的最佳方法是找到在编程方面有经验的更好的程序员(一般来说,尤其是C)。任何半体面的C/C++/Java/C#/Javascript程序员都知道=赋值标准和=相等性测试标准。用字符串标记代替运算符增加了其他程序员的不可读性。坚持使用标准语言运算符。对于等号运算符:将数字文字放在左侧,这样,如果将
=
误键入为
=
,则会引发编译错误。@timrau不总是等号a的另一侧constant@timrau:那真的没用。所有现代编译器都会对用作真值的赋值发出警告,几乎每个人都会发出警告。
已经是
&
的同义词,而不使用预处理器。
没有为
=
提供替代方法。其目的不是提供可读的替代方案;这是为了在字符集有限的系统上使事情变得更容易(现在这可能不是什么大问题)。@KeithThompson我知道。通过将文本更改为“已有可选逻辑运算符”。+1表示-Wall,从而澄清了答案。此外,我还建议使用
-Wall-Wextra-pedantic-std=
原始问题中没有任何内容表明OP甚至使用了GCC。所以这绝对不值得任何投票,堆栈溢出不是GCC论坛。我明白你的意思。尽管如此,我还是明确地说了该做什么(设置所有警告标志)。在括号中,我只是键入了在GCC中执行此操作的方法,没有考虑两次。但问题是:这不仅是回答是否是个坏主意,而且还指出什么是做事情的正确方式。此外,我的印象是,任何有C经验的人都会在某个时候遇到GCC。但我可能错了。
and     &&
and_eq  &=
bitand  &
bitor   |
compl   ~
not     !
not_eq  !=
or      ||
or_eq   |=
xor     ^
xor_eq  ^=