C 对equal and运算符使用宏
最近我更新了自己的C语言。在一些博客中,我读到“==”和“&&&”等运算符会导致程序员分别使用“=”和“&”的错误,程序员花了很多时间来查找和解决问题 我认为为“==”和“&&&”定义宏将解决这个问题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 } } 这
#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 ^=