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可以同时用,程序自身不能修改,但是可以被程序以外的代理改变。
注:有些参考网上大神解答,并非完全原创。