消息关闭
    暂无新消息!

va_arg 使用问题

问题作者 : 白日梦2017-06-15发布
在使用va_arg的时候发现如下两种写法 不等价

1.  
num = sign ? (int)va_arg(args, int) : (unsigned int)va_arg(args, unsigned int);

2. 
if (sign)
    num = (int)va_arg(args, int);
else    
    num = (unsigned int)va_arg(args, unsigned int);[code=c]
[/code]


第一种写法无论sign的值如何,都是进入后面false的分支
第二种写法工作正确。

请问这是怎么一回事。
编译器GCC/ARM GCC, 64位

5个回答

︿ 2
优化没开,汇编还没跟,直接运行的结果很诡异所以直接贴上来问问。
如果把代码改成
num = sign ? (int)va_arg(args, int) : 123;
那么sign=1, 传入参数是-1时, num能得到-1.
原始代码sign=1,传入参数是-1时,num的值是0xffffffff,而num是unsigned long long,这个值就不是-1了
︿ 1
问题不在va_arg,而在条件表达式。
C/C++里的表达式在编译时就需要确定类型,条件表达式也不例外。当条件表达式后两个子表达式类型不一致时会实施类型转化,在这里即前面的int会转换成unsigned int,所以看上去就像无论怎样都会执行false分支。
︿ 0
逻辑短路?
编译器优化掉了?
使用gdb查看每句C/C++语句对应的汇编指令。