大一基础C语言问题

有以下定义语句
double a,b; intw; long c;
若各变量已正确赋值,则下列选项中正确的表达式是______。
D、w=a=b; 错误
若变量a已正确定义,合法的语句是______。
C、a=a++=5错误
若变量已正确定义并赋值,下面符合C语言语法的表达式是______。
B、a=b=c+2 正确 为什么 前两个是错的 最后一个是正确的?
1.以下4个选项中,不能看作一条语句的是______。
A、{;} B、a=0,b=0,c=0;
C、if(a>0); D、if(b==0) m=1;n=2;???
答案:D
2.以下函数值的类型是______。
fun(float x)
{
float y;
y=3*x-4;
return y;
}
A、int B、不确定 C、void D、float
答案:A
3.若有代数式,则不正确的C语言表达式是( C )。
A.a/b/c*e*3 B.3*a*e/b/c C.3*a*e/b*c D. a*e/c/b*3
4.表达式18/4*sqrt(4.0)/8值的数据类型是( C )。
A. int B. floatC. double D. 不确定
5.( × ) 字符数组不要求它的最后一个字符为‘\0’,甚至可以不包含‘\0’。

然后下面5题麻烦讲解下

0)w=a=b w的类型和a b不同,类型不同占用的存储空间和存放的寄存器也不一样,如果要赋值需重新对类型进行注释:w=(int)a=(int)b
0)a=a++=5连环赋值是c和C++特有用法,顺序是从右到左依次赋值,但是,赋值的左边对象必须是一个左值,左值必须是占用固定存储空间的,a++就不是左值,他是一个运算式:a=a+1;
1)D、if(b==0) m=1;n=2;这个是两个语句,因为他有两个;符号
2)以下函数值的类型是 int ,c语言规定,函数类型不写的都是int,例如char fun(float x),函数类型就是char,fun(float x)和int fun(float x)是等价的。
3)暂时没找到错误
4)4.0是一个double类型,和常数混合运算后的值还是double类型。为什么知道4.0是double不是float,因为库函数规定了sqrt()中的形参必须是double。
5)最后一题在使用中的确是允许的,但是会出非常对的漏洞,例如puts的输出函数式见到‘0’就结束的,如果字符数组存满了数据,puts遇不到结束符‘0’就会一直输出,就会出现一堆乱码追问

w=a=b; 这个系统难道不会自动进行强制转换吗?

追答

不行的,赋值用组成原理的说法就是通过总线从一个寄存器传递到另一个寄存器,double类型的寄存器和int是不一样的。

追问

main()
{ int a;
double c=1.0;
a=c;
printf("%d",a);} 这个不是可以的吗?

追答

你自己看下测试后的程序会有警告的,这样做实际上是精度的丢失。比如3.245转化成int后就变成3了。double和int转换还好,要是其他类型的转化(例如unsigned和int的转换)后果会很严重。

追问

如果要赋值需重新对类型进行注释:w=(int)a=(int)b 你这样的注释 跟系统强制的转化有什么区别呢?

追答

  我觉得有必要详细说下。我给个程序你:
  #include
  void main()
  {
  unsigned x=-1;
  if (x<0) printf ("x小于-1");
  else printf ("x不是小于-1");
  }
  这个程序你运行下,执行的else的结果。这是为什么,因为x的值在寄存器里表示的根本不是-1,但是把 if (x<0) 改为 if ((int)x<0)就行了,这是为什么,因为这一步操作实际是把-1的值写入一个有符号的寄存器中。再看下你的程序
  main()
  { int a;
  double c=1.0;
  a=c;
  printf("%d",a);} 你看到没,你是用%d输出的,这个就等同于
  (int)a这样的操作,你告诉了电脑,先把a的值存入int类型寄存器再输出。再往下说就扯远了,建议看下组成原理和汇编相关书籍关于对信息保存和转移的内容。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-01-04
我认为应该都可以的吧。我常这么用啊。

if(b==0) m=1;n=2;这个是因为这里有两条语句了。
if(b==0)
{m=1;n=2;}

我认为是D啊。

3.若有代数式,则不正确的C语言表达式是( C )。A.a/b/c*e*3
B.3*a*e/b/c
C.3*a*e/b*c
D. a*e/c/b*3

ABD都是
(3ae)/(bc)
C是
{3aec)/b

18/4*sqrt(4.0)/8
这里有低就高原则。(QtAIBt0qY4VjnFfyzUthl2NIeR8N2eq1a5P1dRtGBznGknoCIiE-jRk5tEGlxe-cYRHn6F88MMxbeuahP-XXmrB5k_Vd07)

字符数组不要求它的最后一个字符为‘\0’,甚至可以不包含‘\0’。
这个判断是错的。因为字符数组一定要以\0结束。不然就没有终止了。追问

char a[4]={'a','b','c','d'} 这个字符数组难道有’\0'么?

追答

好吧,是我看错了,字符串必须有\0
那这个应该对的吧