我有一个简单而愚蠢的代码片段来分析。 它在本质上进行类似:链接分配和隐式转换的优先级
a = b = c;
但类型是非常棘手的。
在一个地方,我有:
int a,c;
unsigned int b;
在其他地方,我有:
int a;
unsigned int b,c;
如果编译器解释A = B,然后我转换一个unsigned int到int
OK,在2补码上,无论如何,这种转换是无效的
但是这样的转换可能会溢出,这将是UB,是不是?
而在这种情况下,编译器有一个许可证来推测我不依赖UB,因此最终可以认为a> = 0,并且不再进行进一步的测试if(a<0) blah...
它是对的吗?
在这种情况下,两段代码都会导致相同的行为。
如果编译器解释a = c
,我认为这是做什么,如果我上面的UB分析是正确的,那么这两段代码可能会给出不同的结果。
因此,如何在这些表达解释a=b
或a=c
,或者换言之在这种情况下,可以这样的(a<0)
分支被消除,只有一个,两个或无?
最后一点,我的确切情况是内联函数的返回值,但我认为它不会超出上述结论,对吧?
static inline int a1(unsigned int *b,unsigned int c) {return *b=c;}
static inline int a2(unsigned int *b,int c) {return *b=c;}
1.代码中没有强制转换。 2.你发布的函数除了抛出语法错误之外别无其他。 – 2013-03-22 22:47:16
@ H2CO3哎呀,谢谢,我的错误 – 2013-03-22 22:51:14