C语言中变量类型改变导致输出结果错误

如题所述

第1个回答  2019-04-05
printf是一个变参函数,由于printf本身不知道调用时传递给自己的参数个数是多少,以及每个参数的类型分别是什么,需要调用者传递一个格式字符串告诉它,printf从格式字符串中解析占位符得出传递的参数个数以及每个参数的类型,接下来才能正确处理这些参数。如果格式字符串中给出的占位符信息错误,那么就会导致printf对参数的处理错误,输出结果自然也就很有可能不正确。
printf("%ld%f", m, n); 执行这条语句时,printf首先从格式字符串"%ld%f"中得知调用者除了格式字符串还传递了两个参数,第一个是long型,第二个是double型。在Windows中long占4字节而double占8字节,并且printf的调用约定是__cdecl,参数是从右至左入栈的,格式字符串在栈顶。于是printf从栈顶向下4字节的位置取4个字节就能取到第一个long型参数,再向下取8个字节就能取到第二个double型参数,接下来就能正确输出这两个参数到屏幕上了。
而如果调用者误写成了printf("%f%f", m, n);,那么printf会认为调用者传递给了自己两个double型参数,于是它会从栈顶向下4字节和12字节的位置分别取两个8字节的数据当做两个double型并输出它们,然而此时实际的两个参数m和n分别位于栈顶下4~7字节和8~15字节处,于是m的全部4字节和n的前4个字节被一起当作了第一个double型,而n的后4字节和n下方的4字节被当成了第二个double型,最终两个数的输出结果自然都不正确。

C语言中变量类型改变导致输出结果错误?
一、在printf()函数中,你如果用其他变量类型的格式输出一个变量,往往会导致输出错误的结果。如:int a=5;\/\/定义一个整型变量a printf("%f",a);\/\/用浮点型格式输出 你不会得到5或者5.0000(后面几个0),而是得到乱码。二、只有一个例外,就是字符型变量,可以用整型输出,将会输出字符的ASC...

C语言问题 把 INT类型 换成float 就 结果不对 为什么啊
a =50 % 23; \/*求的是50比23的模,模为4,4为整形(int),显然与变量a的类型不 符,导致编译错误*\/ printf("a = %d\\n", a); \/*%d为整形数据输出符,%f为浮点型输出*\/ return 0;} 解决方法:把%d改为%f

C语言中在改变输出变量的值,造成printf输出结果不同。自加运算_百度知...
printf("%d,%d\\n",k,k++);先执行k++再执行k,输出的时候先输出k再输出k++的结果

为什么在C语言中,这个printf的输出是错误的?
你这并不是强制类型转换,printf是个变参函数,而且比较“笨”,它只能识别你给他设定好的输出类型,因为你设定为%d,所以只能输出出错,5\/2是结果是整数,而5.0\/2是浮点数运算,结果为浮点数,所以类型不匹配。 谢谢,望采纳

C语言计算结果出错的原因?
1、数组越界 调用数组元素时使用的索引号超过数组所能提供的索引号的范围。2、未考虑到运算中被除数为0的情况 目前未遇到。3、堆栈溢出(stark overflow)触发原因:(1)变量申请大空间内存(2)递归 解决办法细分:(1)增大栈空间 修改 属性->链接器->系统 中 “堆栈提交大小” “堆栈保留大小” ...

C语言编程变量类型或者输出的一个问题?
float的有效位数是6位,所以f=123456789已超出了f所能正常表示的数据了,所以输出结果是错误的。而double的有效位数是16位,所以,d的输出是正常的。另:printf("\\nf=%f\\t,d=%lf",f,d); \/\/float对应%f double对应%lf

C语言中以单精度浮点型输入,输出格式为%d或%c,为什么显示的数不对?谢谢...
c语言中变量就是float类型,输入使用的格式是%f。不同的变量类型在内存中的储存方式也完全不同,当你用整型格式(int)去读一个浮点格式(float)的数字时,不可能读出正确的结果。所以,你必须用跟输入时相同的格式(%f)输出(另外,还必须跟变量的类型一致),才能显示正确的数字。

c语言中,为什么定义一个char*型的变量会报错。
这是说明类型不兼容,强制转类型。在声明变量 char* 时改成 const char *即可。当用户想在.h声明中定义成员变量,有时会报类型重定义错误,如果不是工程中真的重复定义了多个同名类,那么多半是没有给该类的头文件加条件指示符#ifndef。条件指示符#ifndef 最主要的目的就是防止头文件的重复包含和...

这个C语言哪里错了
错误一,短语要储存在字符数组或字符串数组中,不能存放在字符变量中。你用char定义变量是错误的,应该用类似char*a;或char a[100];定义才行。看你的题目,用字符指针比较好,容易赋值。错误二,用scanf语句输出字符串时,要用%s格式,不能用%c格式,%c是输出单个字符的格式。所以你的输出语句中的...

c语言小白,请问为什么我的这段代码输出结果不正确?应该怎么改呢?求具...
max=Num[0];=>max->0 if(Num[9]>max)=>Num[9]->0,max->0,结果为false 循环结束,返回max=>返回0 所以你输入13的时候输出结果为0。针对这两点我做出如下改动:1、大改了统计个数的代码块,修改为:思想:当arr[i]为1时,计num为1,循环遍历当前元素之后的元素arr[i+1],如果arr[i+...

相似回答
大家正在搜