C语言若干问题锦集

本人是C语言初学者,可惜啊,刚开始学习不久,就遇到了一大堆问题,用“出师不利”来形容是再合适不过的了。以下是我从开始学C语言到现在的所有的问题,希望各位高手多多指导,小弟我在这里感激不尽!

1.以下程序的输出结果是______。
#include <stdio.h> /*以下我这里就有所省略了哈*/
main()
{
int x;
(x=4*5,x*5),x+25;
printf("x=%d\n",x);
}

给的正确答案是x=20,为什么呢,括号里面,先算x=4*5,x=20,再算x*5,这样x最后等于100啊,为什么是20呢?

2.以下程序的输出结果是______。
#include <stdio.h>
main()

int a=15,b=240;
printf("%d\n",(a&b));
}

答案为什么是0呢,15求余240不是等于15么。

3.关于格式数据输出的,对于单精度和双精度类型的实型数可以用“整数1.整数2”的形式在指定宽度的同时来指定小数位的位数,这里的“整数1”和“整数2”分别指的是什么?

“对于整数,用来指定必须输出的数字个数,若输出的数字少于整数2指定的个数,则在数字前面加0补足;若输出的数字多于整数2指定的个数时,按数字的实际宽度输出”这句话对么,为什么是“整数2”而不是“整数1”呢?“整数2”不是只针对小数么?指总体的不是“整数1”么?“整数2”为什么也影响到总体?

4.已知unsigned int x=65535;则执行下列语句后的x的值是?
printf(“%d\n”,x);

答案是-1,怎么算的?

5.以下程序的输出结果是?
#~~~~~~
main()

int w=3,x=10,z=7;
printf(“%d”,x>10?x+100:x-10”);
printf(“%d”,w++||z++);
printf(“%d”,!w>z);
printf(“%d\n”,w && z);


答案是0101,可我算的是0111,问题出在这句printf(“%d”,!w>z);
这句代码最后的结果不是1么,为什么是0呢?

6.以下程序的输出结果是?
~~~~~~
unsigned int a=3,b=10;
printf(“%d\n”,a<<2 | b>>1);
~~~~~~
答案是13,但是我的不一样,我的计算过程是这样的:
3用二进制表示是11,左移两位,是00,10用二进制表示是1010,右移一位是0101,那么它们两个进行位或运算,结果是0111,转换成十进制之后是7,哪里出错了呢?

7.直接简写了哈
float f=3.1415927;
printf(“%f,%5.4f,%3.3f”,f,f,f);

答案是:3.141593,3.1416,3.142
如果没有指定小数位的宽度,那么默认补足6位么?第三个结果,不是用“3.3”限定结果了么,限制了总宽度是3个,那么3.142是4位,超了啊。

8.
float f=31.41592;
printf (“%f,%e”,f,f);

答案是:31.415920,3.14159e+01
最后一个结果的指数形式是怎么化的?

9.
float f=3.5;
printf(“%f,%g”,f,f);

答案是:3.500000,3.5
第一个答案没什么,第二个不是让系统决定用%f还是%e么,为什么是3.5而不是3.500000?不是默认自动补齐6位小数么?

我总觉得我这本教材有点问题,我发现问题之后,翻遍了书,但是还是没有解决,然后就是更加的一头雾水~~~希望高手讲解。
第六个:3是左移位,不是右移位,10是右移位。
第七个:我说的3位是总共的3位,包括整数部分和小数部分。

二楼的第4、6个是错的。

1、这个是几乎不怎么用的逗号表达式,逗号表达式是这样“表达式1, 表达式2”先计算1,后计算2,但是2作为整个表达式的值
这道题里,先计算x = 4 * 5,等于20,之后x * 5 = 100作为表达式的值,而后括号外的x + 25 = 45又作为整个表达式的值返回,但这些值并没有赋值给谁,唯一的赋值操作只有x = 4 * 5,所以x当然就是20了。没有赋值是不会影响变量的。

2、a & b是按2进制位与操作
15的二进制是1111,240的二进制是11110000相当于
00001111
11110000
按位与是指2者都为1则为1,否则为0,这样计算下来就是00000000,自然是0了

3、整数1是一个浮点数的整数部分,整数2是一个浮点数的小数部分。这里是说的编号……1和2
后面你理解错了,这里的整数2是真的数字2的意思,计算机是2进制的,所以一切基础是2

4、%d是输出有符号整数的方法,变量定义的是无符号整数,无符号整数和有符号的区别是2进制的最高位是用来表示数字还是符号。这里为什么是-1我也不大清楚,理论上16位变量-1的2进制是1000000000000001,而65535是1111111111111111。也有可能是编译器对这种类型不匹配就会输出-1。

5、程序运行到这里w=4 z=7,w > z命题必然是假,而!是反的意思,那么就是真,真是0,假是非0

6、你要注意这是16位变量,所以左移后11不会凭空消失的
3 << 2,就相当于0011变成1100,是12
10 >> 1,相当于1010变0101,是5
12 | 5,就是1100 | 0101,结果是1101,13

7、不指定会进尽可能输出更多位
%3.3f指的是整数3位小数3位,小数没有超

8、这个是数学问题了,指数形式就是这样写的,%e输出指数形式而已

9、这题也是和编译器有关的,编译器决定不补那么就不补了,这不是c语言标准定义的东西,是可以编译器自己把握的。说教材是有问题也可以,至少这里并非一定会怎样
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-01-24
1.(x=4*5,x*5),x+25;
赋值语句只有一个,就是那个x=4*5,当然就是20,其它的都没有影响x的值.
2.a&b 这是按位与的符号,求余是%.
3.例如%6.3f,表示总长度至少为6,保留3位小数.
4.在16位系统中,65535就是0xFFFF,用有符号数输出(%d),就是-1,因为-1在内存中恰好也是0xFFFF
5.!表示逻辑反,这个优先级高,要先算.
6.3<<2=1100而不是00
7.依然是%m.nf,m表示最小长度,而不是强制长度.
8.科学记数法要求整数部分必须是1-9
9.g格式:自动选f格式或e格式中较短的一种输出,且不输出无意义的零
第2个回答  2010-01-24
1.先算x=4*5,x=20,再算x*5,但是x的值没变
2.是位运算,&按位与
3.%m.nf,输出m宽,小数占n位
4.输出结果是65535
5.!w=0,0<z,所以是输出0
6.a<<2->1100;
b>>1->101
1100|101->1101
7.小数输出3位啊
8.指数...
9.%g 使用%f和%e表示中的总的位数表示最短的来表示浮点数 G 同g格式,但表示为指数
相似回答