Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用逗号定义表达式_C_Avr - Fatal编程技术网

C 用逗号定义表达式

C 用逗号定义表达式,c,avr,C,Avr,我遇到了一个带有以下表达式的define语句。我不明白整条语句或逗号是怎么把括号内的两个表达式分开的。它看起来像一个函数,我想它不是 #define LCD_SELECT_CS1 (PORTD |= (1<<3), PORTD &= ~(1<<2)) 逗号在C中只是表达式和构造表达式的顺序运算符。这意味着: e1, e2, ..., en 是一个表达式,其值为en的表达式并计算e1,然后计算e2。。。那么我想这里有两个问题: 它做什么/如何工作? 为什么是这样

我遇到了一个带有以下表达式的define语句。我不明白整条语句或逗号是怎么把括号内的两个表达式分开的。它看起来像一个函数,我想它不是

#define LCD_SELECT_CS1 (PORTD |= (1<<3), PORTD &= ~(1<<2))

逗号在C中只是表达式和构造表达式的顺序运算符。这意味着:

e1, e2, ..., en

是一个表达式,其值为en的表达式并计算e1,然后计算e2。。。那么我想这里有两个问题:

它做什么/如何工作? 为什么是这样写的? 它的工作原理是使用逗号运算符,这可能是C中使用最少的运算符。这基本上意味着,先做第一件事,然后再做第二件事。即使它看起来与分隔函数调用中的参数的逗号相同,或者与分隔多个声明(如int i,j;)中的声明器的逗号相同,它也不相同;。另见

还有一个风格问题,为什么这样写,或者这样写是否是个好主意

C中的宏通过文本替换工作。它们不必看起来像任何东西,也不必有意义,一般来说,理解它们的唯一方法就是看看扩展它们后得到了什么。在这里,每当您编写LCD\u SELECT\u CS1时,您得到的是

(PORTD |= (1<<3), PORTD &= ~(1<<2))

如果你能理解什么是PORTD |=1这就是正在发生的事情:


PORTD |=1实际上,它有点像一个函数。但在几个方面它的风格很差……而所有其他部分都保持不变。@ulix谢谢。对于第3位(即第4位)的设置,您的措辞比我原来的措辞更好。我相应地编辑了我的答案。@AntoineMathys-观点正确!我做了相应的编辑,谢谢。现在我了解了它的工作原理,传统的习惯用法是define foo do{whatever;}while0,允许宏调用类似于函数调用,包括生成需要分号终止的单个语句。