我有一些关于c或c++的问题,请教各位
1、为什么我在看《Windows程序设计(第五版)》这本书上的示例时,示例中用malloc函数给某些变量分配内存时,没有强制转换就可以赋值,就像下面这样:
BITMAPFILEHEADER * pbmfh ;
pbmfh = malloc (dwFileSize) ;
这是为什么呢?
2、程序如下:
int main(int argv, char *argc[])
{
float x = 3.0 / 5;
if (0.6 == x)
printf("x = %.f\n", x);
else
printf("x不等于0.6,其值为: %.f\n", x);
system("pause");
return 0;
}
为什么以上程序,打印出来的值是1,而不是0.6?
3、程序如下:
int main(int argv, char *argc[])
{
double x1, x2;
x1 = (3.14 + 1e20) - 1e20;
x2 = 3.14 + (1e20 - 1e20);
printf("x1 = %f", x1);
printf("x2 = %f", x2);
printf("\n");
system("pause");
return 0;
}
为什么上面两种打印的结果不一样,谁能给我介绍哈?
4、程序如下:
#define total(a) (sizeof(a) / sizeof(a[0]))
void init(int array[])
{
int len = total(array);
for (int i = 0 ; i < len ; i++)
{
array[i] = array[i] + 1;
}
}
int main(int argv, char *argc[])
{
int i;
int array[] = {23, 34, 12, 17, 204, 99, 16};
init(array);
for (i = 0 ; i < 7 ; ++i)
printf("%d ", array[i]);
printf("\n");
system("pause");
return 0;
}
在上面的程序中,我定义了一个带参的宏,这个宏计算指定数组的长度,但是,在init函数中调用这个宏时,它总是返回1值,按照我定义的数组长度,应该返回7,为什么不是呢?错误在哪里?
5、程序如下:
int array[] = {23, 34, 12, 17, 204, 99, 16};
#define TOTAL_ELEMENETS(a) (sizeof(a) / sizeof(a[0]))
int main(int argv, char *argc[])
{
int d = -1;
if (d <= TOTAL_ELEMENETS(array) - 2)
{
printf("无符号数与有符号数的问题。");
}
printf("aaaaaaaaa。");
printf("\n");
system("pause");
return 0;
}
为什么上面程序没有打印任何东西?
答:我的理解:无符号数和有符号数之间不能进行比较,所以上述if条件就不成立,if语句当然就不能执行了。
不知道我的理解是否正确。你们有其他的解释吗,希望你们给点答案?
6、程序如下:
int main(int argv, char *argc[])
{
char a;
printf("%d\n", sizeof(a));
printf("%d", strlen(&a));
printf("\n");
system("pause");
return 0;
}
程序的两条打印语句,第一条打印语句输出12, 这个我清楚(a是一个字符变量,分配的空间只有一个字节,打印的当然是1),但是第二条语句打印的是7,我不明白,变量a还没有初始化值,它的长度应该是0,怎么就成了7,即使初始化了值,打印的也应该是1,而不是7,为什么是这样子,到底是什么原因呢?
c++ c
[解决办法]
就回答第4问吧:数组作函数参数,在函数内部,数组参数退化为指针
所以你的宏相当于:sizeof(int*)/sizeof(int) = 1
[解决办法]
1.
在C标准中,void*类型值可以隐式转化为任意type*类型值,所以 malloc前不应当加强制转化,加了属于不良行为;
在C++标准中,0值可以隐式转化为任意type*类型值,所以 malloc前必须加强制转化,不加属于语法错误。
2. 你应当将float改为double,或将0.6改为0.6f,使之类型一致;更主要的是要将 %.f 改为 %f,否则都四舍五入为整数了,比如0.6就输出成1
3. 浮点数 不是 数学中的实数,我来打个比方
一块石头1斤,一座山一万吨,如果你在一座山上放一块石头,正常人通常会记下总重一万吨,而不记为 一万点零零一斤。所以浮点数不满足交换律。
4. 数组降阶,void init(int array[]) 等同于 void init(int* array),array是个指针,而非数组
5. int 和 size_t(为了简单,就假设为unsigned int) 比较,先转化为unsigned int
也就是 if( -1 <= 5u ) 等同于 if( 4294967295u <= 5u ) // 假设int为4bytes
6. 对非'\0'结尾的字符串使用strlen属于错误行为。
[解决办法]
有空常看看c faq
[解决办法]
用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10)
同理,用二进制小数也不能精确表示某些10进制小数。
[解决办法]
计算机中的数据是有范围、精度的。
整型数据类型的精度最高