对张量奇学长所提问题的解答

1、 单精度浮点数的定义:float adf = 0.2;为什么会警告?

因为0.2默认是双精度,所以添上f即可,float adf = 0.2f;


2、 int和long int有多少位?


#include<stdio.h>
int main()
{
printf("%zd\r\n",sizeof(long int));
printf("%zd", sizeof(int));
}


我的输出是4,4


3、 怎样正确的比较float型变量和0的大小?


float型变量和“零值”比较的方法:
const float EPSINON = 0.000001;
if ((x >= - EPSINON) && (x <=EPSINON))
浮点型变量并不精确,其中EPSINON是允许的误差(即精度),所以不可将float变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。如果写成if (x == 0.0),则是错误的。
因为1.0在计算机中可能存为0.999999或1.00001等,很难恰好是1.0


4、 有符号数是怎样存储的?


第一位是符号位,1为负,0为正


5、 有符号数是怎样移位的?
仅是无符号数操作,左移动N位,是乘以2的N次方
右移N位,是除以2的N次方
带符号数操作,丢弃符号位最高位,0补最低位。
总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多


6、 数组名、指针和地址之间有什么关系?


数组名就是数组第一个元素的地址,用其代替数组地址。a=&a[0]


7、 指针常量、常量指针和常量常指针有什么区别?


int a;
int * const p = &a    //指针常量,*p可以修改*p = 8;(OK)
                                                   p不可以修改 p++(ERROR)
int a,b;
const int *p = &a;//常量指针    *p不可修改 *p = 8;(ERROR)
                                                  p 可以修改 p = &b  (OK)
还有一种
const int * const p = &a;    // *p 和 p均不可改变了


8、 空指针和野指针有什么区别?
空指针:空指针是一个特殊的指针值,也是唯一一个对任何指针类型都合法的指针值。指针变量具有空指针值,表示它当时处于闲置状态,没有指向有意义的东西。
通用指针:通用指针,它可以指向任何类型的变量。通用指针的类型用(void *)表示,因此也称为void 指针。
野指针:野指针也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。
#include<stdio.h>
int main()
{
int a = 3;
int *p=0;//或者把0换成NULL
void*b = NULL;
int*c;
a = a << 3;
p = &a;
b = &a;
printf("%d",*p);
//printf("%d", *c);//野指针不能使用,未进行初始化
//printf("%d", *b);//不能void*不能复引用
return 0;

}


9、 typedef和define定义的数据类型有什么区别?


typedef    (int*)      pINT;以及下面这行:#define    pINT2   int*
    效果相同?实则不同!实践中见差别:pINT a,b;的效果同int *a; int *b;表示定义了两个整型指针变量。而pINT2 a,b;的效果同int *a, b;表示定义了一个整型指针变量a和整型变量b。
    注意:两者还有一个行尾;号的区别哦


10、 #define定义的函数时,参数应该注意什么?


#define  f(x)  x*x+1 (⊙o⊙)…还有什么


11、 宏定义是怎样展开的?

#include <stdio.h>
//"#n"如此不被当做字符串一部分,而是变成参数,可以去掉尝试一下
#define paster( n ) printf( "token " #n" = %d\n ", token##n )
#define a(n)  x##n//如果把##去掉就不对了
int main()
{
int token9=10;
paster(9);
int a(4)=0;//一定要赋值
printf("%d",x4);
return 0;
}


12、 预处理都做了什么?
注释,define(typedef在编译阶段,不在预处理),条件编译
#include<stdio.h>#define test 3 //宏定义 test 为3 
void main(void)
{        
#ifdef test 3   //判断 test是不是被宏定义为3,是        
printf(" test 3  !\n");        
#else           //不是        
printf("else !\n");       
 #endif

}


13、 static定义的变量和函数各有什么性质?

不可以被其他文件引用


14、 sizeof是函数吗,和strlen有什么区别?


sizeof是算符,strlen是函数。 
sizeof还可以用函数做参数,比如: 
short f();
printf("%d\n", sizeof(f()));
输出的结果是sizeof(short)
大部分编译程序 在编译的时候就把sizeof计算过了 
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;


15、 volatile和代码优化有什么关系吗?
a=x;
b=x;
比如x被使用了两次,但是他的值没有被修改,那么编译器就会把x存到一个地方,而不是初始点,这样再用x时就直接从这个地方获取,更快。

但是x的值被改变了就不一样了。如果没有规定volatile的话,编译器为了安全就不会设置上面提到的这样的缓存区,就不会优化。有了的话,如果不用关键字volatile的话,计算机就会尝试用这样的一个缓存区进行优化。因此volatile的设定给计算机(编译器)优化的机会。另外volatile和const可以同时用,程序自身不能修改,但是可以被程序以外的代理改变。


注:有些参考网上大神解答,并非完全原创。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值