Chinaunix

标题: expression?pattern1:pattern2的问题 [打印本页]

作者: dl0622    时间: 2010-02-24 11:20
标题: expression?pattern1:pattern2的问题
  1. #include<iostream.h>

  2. #define ByteAllign(len) ( ((len) % 4) ? (len) + 4 - (len) % 4 : (len))
  3. #define absolute_value( x ) ( ((x) < 0) ? -(x) : (x) )

  4. int main()
  5. {
  6.     int nLen ;
  7.     cout << "please input an int type value : " ;
  8.     cin >> nLen;
  9.     int AllignResult = ByteAllign(nLen);
  10.     int AbsoluteValue = absolute_value(nLen);
  11.     cout << "allign value is : " << AllignResult << endl ;
  12.     cout << "AbsoluteValue is : " << AbsoluteValue << endl ;
  13. }
复制代码
上面这段代码,#define ByteAllign(len) ( ((len) % 4) ? (len) + 4 - (len) % 4 : (len))
这句不是说当len能整除4时执行(len) + 4 - (len) % 4,否则执行(len)吗?为什么实际结果跟我理解的刚好相反呢???
作者: 雨过白鹭洲    时间: 2010-02-24 11:30
((len) % 4 == 0)

或者后面两个表达式反过来
作者: xyfree    时间: 2010-02-24 11:31
len%4 == 0  -->  len

len%4 != 0   -->  len+4-len%4
作者: dl0622    时间: 2010-02-24 12:56
还是理解不了,条件(len) % 4根本不知道是什么值,咋知道什么情况下取前一个表达式,什么时候取后一个表达式。
作者: daybreakcx    时间: 2010-02-24 13:02
本帖最后由 daybreakcx 于 2010-02-24 13:04 编辑

4 - len % 4这个部分就是补齐的量,是往len后添加的,当len % 4非0的时候才进行补齐,也就是前一个表达式
作者: pagx    时间: 2010-02-24 13:06
(((len) + 3) & ~0x03)

exp 为真取前者,否则取后者。
C 语言只要exp值不为零,就是真。为零则假。
作者: dl0622    时间: 2010-02-24 13:38
顶顶顶,楼上正解!C++也应该一样




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2