c语言几道易错题
1、猜其打印结果
int main()
{
int i = 0;
i--;
if (i > sizeof(i))
printf(">");
else
printf("<");
return 0;
}
结果是“>” ,因为sizeof操作符的结果其实是无符号型,这个时候signed要进行算术转换,变成unsigned,-1【1111111111111111111111111111111】在无符号int中对应的是极大的值,远大于1
所以结果是">"
一个表达式中既有有符号又有无符号,会将有符号转换为无符号,进行运算,就是向上转换
int | unsigned int | long int | unsigned long int | float | double | long double |
—————————————————————————————————————————>>>
向上提升
2、求a,b,c 的值
int main()
{
int a, b, c;
a = 5;
c = ++a;
b = ++c, c++, ++a, a++;
b += a++ + c;
printf("%d %d %d\n", a, b, c);
return 0;
}
=的优先级高于 , +=的优先级比 + 低
9 23 8
3、求a的值
int a = 1;
void test()
{
int a = 2;
a += 1;
}
int main()
{
test();
printf("%d", a);
return 0;
}
结果是 1
在函数test中的 a 是咱们定义的局部变量,当局部变量和全局变量冲突是,在局部的时候优先局部变量,咱们已经在局部声明它是个局部变量,所以无论它在局部如何变化,都不影响全局变量a
如果我们把test()中的 int a=2中的int 去掉,答案就变成了 3,因为这个时候a没有声明是局部变量,我们在使用的时候,就认为是是全局变量的那个a
4、关于指针说法,下列哪个正确?
A、int* const p 与 int const *p 等价
B、const int *p与int *const p 等价
C、const int*p与int const *p等价
D、int *p[10] 与 int(*p)[10]等价
a、左const修饰 p ;右修饰*p,不等价
b、与上面相反
c、都是修饰*p,不能随意改变*p指向的对象 √
d、int* p[10] 与 int (*p)[10]不等价
前者定义了一个指针数组,其中包含10个指针(地址)
后者定义了一个指针p,指向了一个包含10个int型元素的数组