#define ABC(i) (i<=0?i:-i)
int main ()
{
int j =1;
int asn;
asn = ABC(--j); //++j/j++/j--这几个可以用!为什么啊?
printf("%d\n",sun);
}
--------------------------------------------------------------------------//为什么++j的结果是-3啊!谁能解释一下
而面试的时候就这样的题目我写的是结果是sun =-1;而运行下来不能运行啊!怎么搞的!
sun 是不是应该为asn呀?
#define ABC(i) (i<=0?i:-i)
int main ()
{
int j =1;
int asn;
asn = ABC(); //这样就可以了!
printf("%d\n",sun);
}
sun 是不是应该为asn呀?
#define ABC(i) (i<=0?i:-i)
int main ()
{
int j =1;
int asn;
asn = ABC(); //这样就可以了!
printf("%d\n",sun);
}
(i<=0?i:-i)
????
结果为0吧?
#define ABC(i) (i<=0?i:-i)改成
#define ABC(i) (i<=0?i:-(i))就可以运行了。
这样的话asn = (--j<=0? --j: -(--j));
什么公司出这样的题目,程序员的大忌!
又是这一类题。
gcc 下结果为 -1.
这样的宏定义简直是噩梦,<<c语言缺陷和陷阱>> 里面有详细的讲解。
宏和函数不同,它只是将文本在指定位置展开。
以下是我的一些看法:
#define ABC(i) (i<=0?i:-i)
首先了解一下该宏的意图:负数或 0 保持该数不变,正数取该数相反数。
给每个参数加上括号是最基本的要求。
如:ABC(j+k)
展开后就是: j+k<=0?j+k:-j+k
完全是另外一个意思了。
应该改成 #define ABC(i) ((i)<=0?(i):(-(i)))
ABC(--j); 之类的会在条件运算符两边都出现的同一个变量,避免用 define,改用函数。
结果为 -1 , 估计是这样的。
展开后 --j<=0?--j:---j;
先计算左边 j = 1 --> j = 0 满足条件 <=0;
计算冒号前表达式 --j --> j = -1.
只是猜测。
++j时候
asn =(++j<=0? ++j:-(++j));//1加了2遍就等于3了啊,后面有负号就是-3
--j时候 同理把宏展开就行了
宏运算就是替代,所以
asn = ABC(--j);
就因改是:
asn=(--j<=0?--j:---j);
--j--->0;
--j--->-1;
++j当然是-3了!
ABC的宏,我们还原一下!
ABC((++j)) 等价 (++j)<=0?(++j):-(++j)
看看j一共被加了几次?
是两次!
1+2很简单吧?