发新帖本帖赏金 0.40元(功能说明)我要提问
返回列表
打印
[C语言]

宏定义的问题

[复制链接]
1069|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
最近看一本书《AVR单片机应用专题精讲》。
第一章1.2.3取特定参数
我看了以后,用VC写了个小程序。
#include<stdio.h>


#define LED 1,0
#define UTIL_ARG1(a,b) a
#define UTIL_ARG2(a,b) b

int main(void)
{
        if(UTIL_ARG1(LED)==0x00)
                printf("OK!");
        else
                printf("NO!");
        //unsigned int i;
        //i=UTIL_ARG1(LED);
        //printf("%d",i);
        //getchar();
}

我的意思UTIL_ARG1(LED)应该为1,也就是正常应该打印NO!
可是打印出的却是OK!
我还专门打印出UTIL_ARG1(LED)的值,确实是1
#include<stdio.h>


#define LED 1,0
#define UTIL_ARG1(a,b) a
#define UTIL_ARG2(a,b) b

int main(void)
{
        //if(UTIL_ARG1(LED)==0x00)
        //        printf("OK!");
//        else
        //        printf("NO!");
        unsigned int i;
        i=UTIL_ARG1(LED);
        printf("%d",i);
       
}


请问高手,哪里有问题?谢谢!

相关帖子

沙发
JY-DX-JY|  楼主 | 2016-4-6 14:36 | 只看该作者
高手支招啊

使用特权

评论回复
板凳
pkuzhx| | 2016-4-6 15:39 | 只看该作者
UTIL_ARG1(LED)并不是你预想的UTIL_ARG1(1,0)

使用特权

评论回复
地板
JY-DX-JY|  楼主 | 2016-4-6 15:50 | 只看该作者
pkuzhx 发表于 2016-4-6 15:39
UTIL_ARG1(LED)并不是你预想的UTIL_ARG1(1,0)

谢谢!那到底是怎么回事呢?还请明示。

使用特权

评论回复
5
pkuzhx| | 2016-4-6 15:58 | 只看该作者
至于你提到的那个打印出来是1的问题,我也搞不懂,期待宏定义高手解答。

不过既然这种用法与你预想的效果根本不一样,说明这种用法本身就是有问题的,是不应该出现的,所以还是不纠结了,来踢狗吧

使用特权

评论回复
6
JY-DX-JY|  楼主 | 2016-4-6 16:12 | 只看该作者
好吧,期待高手解答

使用特权

评论回复
7
cuya| | 2016-4-6 22:28 | 只看该作者
宏参数错误。

UTIL_ARG1(a,b)  要求两个参数, 而UTIL_ARG1(LED) 只有一个 LED 参数, 所以会出现奇怪的现象。注意宏的展开次序, 编译器先展开UTIL_ARG1, 不是先展开 LED.

使用特权

评论回复

打赏榜单

JY-DX-JY 打赏了 0.10 元 2016-04-07
理由:很给力

8
xgliyouquan| | 2016-4-6 22:32 | 只看该作者
VC与单片机编译软件有差异,即使程序正确,结果也不一定相同

使用特权

评论回复
9
cuya| | 2016-4-7 01:00 | 只看该作者
UTIL_ARG1(LED) 只有一个 LED 参数,  所以 UTIL_ARG1(LED) 返回 LED, 即1,0     不是 1.

if(UTIL_ARG1(LED)==0x00) 成为  if (1, 0==0x00)     等于 if(1).
i=UTIL_ARG1(LED) 成为 i=1,0          等于 i = 1



使用特权

评论回复
10
cuya| | 2016-4-7 01:08 | 只看该作者
if(UTIL_ARG1(LED)==0x00) 成为  if (1, 0==0x00)     应等于 if(0==0x00).   逗号分隔返回最后的表达式。

使用特权

评论回复
11
sunhq02| | 2016-4-7 08:33 | 只看该作者
9,10楼是正解

使用特权

评论回复
12
JY-DX-JY|  楼主 | 2016-4-7 08:52 | 只看该作者
cuya 发表于 2016-4-7 01:08
if(UTIL_ARG1(LED)==0x00) 成为  if (1, 0==0x00)     应等于 if(0==0x00).   逗号分隔返回最后的表达式。 ...

谢谢!我看你9楼和10楼说的矛盾。
到底是if(1)还是if(0=0x00)。
不过iif(1)和if(0==0x00)效果一样。
可是那个逗号分隔返回最后的表达式
i=1,0 i=1和0的效果就不一样了

使用特权

评论回复
13
ywlzh| | 2016-4-7 10:34 | 只看该作者
给你一个活生生的例子:


看这里:



C语言提供一种特殊的运算符——逗号运算符。用它将两个表达式连接起来。如:

  3+5,6+8

称为逗号表达式,又称为“顺序求值运算符”。逗号表达式的一般形式为

         表达式1,表达式2

逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。例如,上面的逗号表达式“3+5,6+8”的值为14。又如,逗号表达式
  a=3*5,a*4
对此表达式的求解,读者可能会有两种不同的理解:一种认为“3*5,a*4” 是一个逗号表达式,先求出此逗号表达式的值, 如果a的原值为3,则逗号表达式的值为12,将12赋给a, 因此最后a的值为12。另一种认为:“a=3*5”是一个赋值表达式”,“a*4”是另一个表达式,二者用逗号相连,构成一个逗号表达式。这两者哪一个对呢?赋值运算符的优先级别高于逗号运算符, 因此应先求解a=3*5(也就是把“a=3*5”作为一个表达式)。经计算和赋值后得到a的值为15,然后求解a*4,得60。整个逗号表达式的值为60。
  一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式,如(a=3*5,a*4),a+5 先计算出a的值等于15,再进行a*4的运算得60(但a值未变,仍为15),再进行a+5得20,即整个表达式的值为20。
  逗号表达式的一般形式可以扩展为

    表达式1,表达式2,表达式3……表达式n

它的值为表达式n的值。

  逗号运算符是所有运算符中级别最低的。因此,下面两个表达式的作用是不同的:

  ① x=(a=3,6*3)
  ② x=a=3,6*a

  第①个是一个赋值表达式,将一个逗号表达式的值赋给x,x的值等于18。第②个是逗号表达式,它包括一个赋值表达式和一个算术表达式,x的值为3。

  其实,逗号表达式无非是把若干个表达式“串联”起来。在许多情况下,使用逗号表达式的目的只是想分别得到各个表达式的值,而并非一定需要得到和使用整个逗号表达式的值,逗号表达式最常用于循环语句(for语句)中.

  请注意并不是任何地方出现的逗号都是作为逗号运算符。例如函数参数也是用逗号来间隔的。如

  printf("%d,%d,%d",a,b,c);

  上一行中的“a,b,c”并不是一个逗号表达式,它是printf函数的3个参数,参数间用逗号间隔。
如果改写为

  printf("%d,%d,%d",(a,b,c),b,c);

则“(a,b,c)”是一个逗号表达式,它的值等于c的值。括弧内的逗号不是参数间的分隔符而是逗号运算符。括弧中的内容是一个整体,作为printf函数的一个参数。
C语言表达能力强,其中一个重要方面就在于它的表达式类型丰富,运算符功能强,因而c使用灵活,适应性强

使用特权

评论回复
14
ywlzh| | 2016-4-7 10:34 | 只看该作者
怎么样?

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
cuya + 4
15
cuya| | 2016-4-7 10:44 | 只看该作者
10 楼是对 9楼的更正。

i = 1,0 实际上是两个表达式 (i=1) 与 0,因为 (i=1, 0 )返回 0 没有意义, 最后 i=1.
i = (1,0) 这个表达式中 (1,0)返回 0, 所以最后 i=0.

使用特权

评论回复
16
JY-DX-JY|  楼主 | 2016-4-7 11:45 | 只看该作者
ywlzh 发表于 2016-4-7 10:34
给你一个活生生的例子:

谢谢

使用特权

评论回复
17
JY-DX-JY|  楼主 | 2016-4-7 11:46 | 只看该作者
ywlzh 发表于 2016-4-7 10:34
给你一个活生生的例子:

谢谢

使用特权

评论回复
18
洛理小子| | 2016-4-7 13:38 | 只看该作者
学习了

使用特权

评论回复
发新帖 本帖赏金 0.40元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:晴天响霹雳,平地一声雷。

245

主题

3351

帖子

30

粉丝