int main()
{
unsigned int c = -1;
char *s = "Abc";
char *x = "defhe";
((strlen(s)-strlen(x))>c)? printf(s): printf(x);
}
c
的值为4294967295
且(strlen(s)-strlen(x))
的值为4294967294
,它应打印x
,但它正在打印s值。我不知道为什么会那样
答案 0 :(得分:6)
c的值为4294967295,(strlen(s)-strlen(x))的值为4294967294
(strlen(s)-strlen(x))
产生4294967294
并非必然。这取决于您系统上SIZE_MAX
的值。
如果SIZE_MAX
为18446744073709551615
(通常在64位系统上),则(strlen(s)-strlen(x))
将为18446744073709551614
,明显大于4294967295
(假设{ {1}}是UINT_MAX
)。因此,您会看到4294967295
正在打印。
使用printf(s);
语句查看值并了解:
printf()
答案 1 :(得分:2)
您似乎使用格式说明符strlen(s)-strlen(x)
输出了表达式%u
,例如
printf( "%u\n", ( unsigned int )( strlen(s)-strlen(x)));
printf( "%u\n", c );
在这种情况下,输出确实等于
4294967294
4294967295
但是,如果使用强制转换将这些表达式输出到类型size_t
和格式说明符%zu
,则会得到
printf( "%zu\n", strlen(s)-strlen(x));
printf( "%zu\n", ( size_t ) c );
和
18446744073709551614
4294967295
因此,表达式strlen(s)-strlen(x)
的值大于已转换为c
类型的变量size_t
的值。
如果sizeof( size_t )
等于sizeof( unsigned int )
,您可以获得预期结果。
答案 2 :(得分:1)
从@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
...
if (savedInstanceState != null) {
//Restore the fragment's state here
}
}
...
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//Save the fragment's state here
}
/ int
到unsigned int
类型的这种隐式转换容易出错且难以检测。像PVS-Studio这样的静态代码分析器可以很好地自动发现这些错误。