全国计算机二级第一套

10在数据库系统中,考虑数据库实现的数据模型是

A)概念数据模型

B)逻辑数据模型

C)物理数据模型

D)关系数据模型

答案:B

【解析】数据模型按照不同的应用层次分为以下3种类型:概念数据模型,它是一种面向客观世界、面向用户的模型,它与具体的数据库管理系统和具体的计算机平台无关;逻辑数据模型,是面向数据库系统的模型,着重于在数据库系统一级的实现;物理数据模型,是面向计算机物理实现的模型,此模型给出了数据模型在计算机上物理结构的表示。B选项正确。

 

11以下叙述中错误的是(  )。

A) 使用三种基本结构构成的程序只能解决简单问题

B) 结构化程序由顺序、分支、循环三种基本结构组成

C) C语言是一种结构化程序设计语言

D) 结构化程序设计提倡模块化的设计方法

答案:A

【解析】使用顺序,选择(分支),循环三种基本结构构成的程序可以解决所有问题,而不只是解决简单问题,所以A)错误。

 

12以下选项中叙述正确的是

A) 函数体必须由 { 开始

B) C程序必须由main语句开始

C) C程序中的注释可以嵌套

D) C程序中的注释必须在一行完成

答案:A

【解析】函数体是函数首部下面的花括号内的部分,所以函数体必须由{开始,A选项正确。一个源程序文件可以包括预处理命令、全局声明、函数定义,程序总是从main函数开始执行的,不是main语句,B选项错误。C程序中的允许两种注释,以//开头的单行注释;以/*开始,以*/结束的块式注释,D选项错误。函数可以嵌套,注释不能嵌套,C选项错误。

 

13以下叙述正确的是

A) C编译程序把文件后缀为.c的源程序文件编译成文件后缀为.obj的二进制文件

B) C编译程序把文件后缀为.c的源程序文件编译成文件后缀为.exe的可执行文件

C) C编译程序把文件后缀为.obj的二进制文件编译成文件后缀为.exe的可执行文件

D) 链接程序把文件后缀为.c的源程序文件链接成文件后缀为.exe的可执行文件

答案:A

【解析】C编译程序把文件后缀为.c的源程序文件编译成文件后缀为.obj的二进制文件,链接将一个或多个目标文件与程序用到的库文件连接起来,形成一个可以在操作系统直接运行的执行程序.exe,故排除B,C,D选项,答案选A选项。

14按照C语言规定的用户标识符命名规则,不能出现在标识符中的是(  )。

A) 大写字母

B) 下划线

C) 数字字符

D) 连接符

答案:D

【解析】C语言中标识符由字母、下划线、数字组成,且开头必须是字母或下划线。所以D)选项中的连接符不合法。

15下列定义变量的语句中错误的是

A) int  _int;

B) double  int_;

C) char  For;

D) float  US$;

答案:D

【解析】C语言规定,变量命名必须符合标识符的命名规则。D选项中包含了非法字符"$",所以错误。标识符由字母、数字或下划线组成,且第一个字符必须是大小写英文字母或者下划线,而不能是数字。大写字符与小写字符被认为是两个不同的字符,所以For不是关键字for。

16C语言中的标识符分为关键字、预定义标识符和用户标识符,以下叙述正确的是

A) 关键字可用作用户标识符,但失去原有含义

B) 预定义标识符可用作用户标识符,但失去原有含义

C) 在标识符中大写字母和小写字母被认为是相同的字符

D) 用户标识符可以由字母和数字任意顺序组成

答案:B

【解析】关键字不可用作C语言的标识符,所以A错误。在标识符中大写字母与小写字母作为不同字符处理,所以C错误。标识符由下划线、字母、数字组成,且必须以下划线和字母开始,所以D错误。

17以下选项中合法的常量是

A) 9  9  9

B) 2.7e

C) 0Xab

D) 123E 0.2

答案:C

【解析】A选项中含有非法的空格,所以错误。C语言中十六进制常量以0x开头,所以C正确。实型常量中e的前后必须均有数据,且其后必须为整数,所以B和D错误。

17有以下程序

#include <stdio.h>

main()

{  int  k=33;

   printf("%d,%o,%x\n", k, k, k);

}程序的运行结果是

A) 33,41,21

B) 33,33,33

C) 41,33,21

D) 33,21,41

答案:A

【解析】整型常量有3种表示方法,分别是十进制数表示法、八进制数表示法和十六进制数表示法。十进制整型常量没有前缀,输出格式控制符为%d;八进制整型常量以0作为前缀,输出格式控制符为%o;十六进制整型常量以0X或0x作为前缀,输出格式控制符为%x。整型33用八进制表示为41,十六进制表示为21,A选项正确。

18以下选项中,合法的一组C语言数值常量是(  )。

A) 12. 0Xa23 4.5e0

B) 028 .5e-3 -0xf

C) .177 4e1.5 0abc

D) 0x8A 10,000 3.e5

答案:A

【解析】C语言中八进制整型常量的开头是数字0,十六进制整型常量的开头数字是0x。C语言中的实型常量有两种表示形式:小数形式,小数形式表示的实型常量必须要有小数点;指数形式,以"e"或"E"后跟一个整数来表示以10为底数的幂数,且规定字母e或E之前必须要有数字,且e或E后面的指数必须为整数。B)选项中 028错误,八进制中没有数字8。C)选项中4e1.5中e后面的指数不是整数。D)选项中数字“10,000”不能用逗号。

19已知大写字母A的ASCII码是65,小写字母a的ASCII码是97。以下不能将变量c中的大写字母转换为对应小写字母的语句是()。

A) c=('A'+c)%26-'a'

B) c=c+32

C) c=c-'A'+'a'

D) c=(c-'A')%26 +'a'

答案:A

【解析】根据题意可知,小写字母比与之对应的大写字母的ASCII码大32。A选项中字符A加上c表示的大写字符再对字母个数26取余,本身这个表达式没有任何含义所以选择A选项。

20若有定义:double  a, b, c; 能正确给a,b,c输入数据的语句是()。

A) scanf(" %lf %lf %lf" &a, &b, &c )

B) scanf(" %f %f %f",&a, &b, &c );

C) scanf(" %lf %lf %lf",a, b, c );

D) scanf(" %lf %lf %lf",&a, &b, &c );

答案:D

【解析】%lf,%le是针对double的,如果仅用%f,输入的数据可能不完全接收,数据的精度可能不足。%f主要针对float类型的变量的输入,因此选项B错误。根据题目格式可知A,C错误。故答案为D选项。

21)若有以下程序段

    double x=5.16894;

    printf("%f\n",  (int)(x*1000+0.5)/(double)1000  );

则程序段的输出结果是

A) 5.170000

B) 5.175000

C) 5.169000

D) 5.168000

答案:C

【解析】%f的输出格式是以带小数点的数学形式输出浮点数。首先计算x*1000,结果为5168.94然后+0.5,结果为5169.44,然后进行强制类型转换,转换成整型为5169,然后除以双精度数据1000,结果也为双精度数据5.169,输出时按照%f的格式输出,所以输出结果为5.169000。

22)若变量已正确定义,在if (W) printf("%d\n" ,k ); 中,以下不可替代W的是(  )。

A) a<>b+c

B) ch=getchar()

C) a==b+c

D) a++

答案:A

【解析】选项A)是非法的表达式,C语言中没有<>运算符。

(23) #include   <stdio.h>

main()

{ int  x, y, z;

  x=y=1;

  z=x++,y++,++y;

  printf("%d,%d,%d\n",x,y,z);

}

程序运行后的输出结果是(  )。

A) 2,3,3

B) 2,3,2

C) 2,3,1

D) 2,2,1

答案:C

【解析】z=x++,y++,++y;因为赋值运算符的优先级高于逗号运算符的优先级,所以可以将上式表示成(z=x++),(y++),(++y)。然后从左向右先计算表达式z=x++,因为x++先使用后自增,所以z的值为1,x的值为2。再计算逗号表达式第二个表达式y++,此时y的值为2,最后计算第三个表达式++y,y的值为3。

24)有如下程序

#include <stdio.h>

main()

{

    int a = 0, b = 1;

    if (a++ && b++)

        printf("T");

    else

        printf("F");

    printf("a=%d,b=%d\n", a, b);

}

程序运行后的输出结果是

A) Ta=1,b=2

B) Fa=0,b=2

C) Fa=1,b=1

D) Ta=0,b=1

答案:C

【解析】题目中判断if条件是否成立,a++先取值为0,则(a++ && b++)为0,且不计算b++,而后a自增得a=1,if条件不成立执行else函数体,输出F。最后执行语句printf("a=%d,b=%d\n", a, b);按照格式输出a=1,b=1。C选项正确。

25)有以下程序

    #include <stdio.h>

    main()

    {  char *s="120119110";

       int n0,n1,n2,nn,i;

       n0=n1=n2=nn=i=0;

       do{

            switch(s[i++])

            {  default   : nn++;

               case  '0' : n0++;

               case  '1' : n1++;

               case  '2' : n2++;

             }

           } while(s[i]);

      printf("n0=%d,n1=%d,n2=%d,nn=%d\n",n0,n1,n2,nn);

    }

   程序的运行结果是()。

A) n0=3,n1=8,n2=9,nn=1

B) n0=2,n1=5,n2=1,nn=1

C) n0=2,n1=7,n2=10,nn=1

D) n0=4,n1=8,n2=9,nn=1

答案:A

【解析】本题执行过程为,s[0]='1',匹配case'1',n1=1,n2=1;s[1]='2',匹配case'2', n2=2;s[2]='0',匹配case'0',n0=1,n1=2,n2=3;s[3]='1',匹配case'1',n1=3,n2=4;s[4]='1',匹配case'1',n1=4,n2=5;s[5]='9',匹配default,nn=1,n0=2,n1=5,n2=6;s[6]='1',匹配case'1',n1=6,n2=7;s[7]='1',匹配case'1',n1=7,n2=8;s[8]='0',匹配case'0',n0=3,n1=8,n2=9;s[9]='\0',退出循环。输出n0,n1,n2,nn为3,8,9,1,A选项正确。

26)有以下程序

#include <stdio.h>

main( )

{  int i,j = 0;

   char a[] = "How are you", b[10] = {0};

   for (i=0; a[i]; i++)

     if (a[i] == ' ')

        b[j++] = a[i+1];

   printf("%s\n",b);

}

程序运行后的输出结果是()。

A) Hay

B) Howareyou  

C) we   

D) ay

答案:D

【解析】for语句循环体执行功能是,每次当a[i]元素为' '时,自动将a[i]下一个元素赋值给b[j],赋值完成后,j值加1,因此a[i]的'a'和'y'分别赋值给b[0],b[1],答案为D选项。

27)有以下程序

#include  <stdio.h>

main()

{  char  a=3, b=6, c;

   c=(a^b)<<2;

   printf("%d \n", c );

}

程序运行后的输出结果是()。

A) 5

B) 1

C) 20

D) 18

答案:C

【解析】^运算符为按位异或运算符,即0^1=1,1^0=1,1^1=0,0^0=0,因此a^b=101在进行<<操作,变为101002=2010,因此答案为C选项。

28)有如下程序

#include <stdio.h>

main()

{

    int i, *ptr;

    int array[5] = {5,3,1};

    for (ptr=array, i=0; i<5; i++, ptr++)

    {

        if (*ptr == 0)

            putchar('X');

        else

            putchar('A' + *ptr);

    }

    printf("\n");

}

程序运行后的输出结果是

A) FDBXX

B) FFFXX

C) FDBBB

D) ABCDE

答案:A

【解析】在对数组进行初始化时,如果对数组的全部元素赋以初值,定义时可以不指定数组长度,如果被定义数组的长度与初值个数不同,则数组长度不能省略;如果在说明数组时给出了长度,但没有给所有的元素赋予初始值,而只依次给前面的几个数组元素赋予初值,那么C语言将自动对余下的元素赋初值,则array={5,3,1,0,0}。程序执行过程为:执行for循环,将数组首地址赋给指针ptr,依次遍历每一个元素,如果数组元素为0则输出‘X,如果不为0则按照字母表输出字符‘A后第array[i]个字符。程序运行后的输出结果为:FDBXX,A选项正确。

29)有以下程序

#include <stdio.h>

main()

{  

    char  *s="12134";

    int  k=0, a=0 ;

    while( s[ k +1 ] )

    {  

        k++;

        if ( k % 2 ==0 )

        {

             a = a + ( s[ k ] - '0' +1 ) ;

             continue;

        }

        a = a + ( s[ k ] - '0' );

    }

    printf (" k=%d a=%d\n", k, a );

}

程序运行后的输出结果是()。

A) k=5 a=15

B) k=4 a=12

C) k=6 a=11

D) k=3 a=14

答案:B

【解析】当k=0时,执行while一次,得到k=1,a为2;当k=1时,执行while一次,得到k=2,a为4;当k=2时,执行while一次,得到k=3,a为7;当k=3时,执行while一次,得到k=4,a为12;所以答案为B选项。

30)有以下程序

    #include <stdio.h>

    main()

    {  int  a, b;     

       for( a=1,b=1; a<=100; a++ )

       {  if(b>=20) break;

          if(b % 3==1) {  b=b+3; continue; }

          b=b-5;

       }

       printf("%d\n",a);

    }

程序的输出结果是()。

A) 10

B) 9

C) 8

D) 7

答案:C

【解析】首先注意for循环的控制条件当b>=20或者a>100则跳出for循环也即b<20且a<=100时执行for循环;第一次进入循环a=1,b=1均满足循环条件,但b%3==1条件满足,故执行b=b+3,得到b=4,注意有continue,所以后面语句不执行,直接跳转到a++这个语句,所以第一次循环完之后a=2,b=4;进入第二轮循环,b%3==1也是满足的,故再次b=b+3,此轮循环执行之后a=3,b=7,进入下一轮。此后和前面循环同理,都是b%3==1满足,因为每次都是加3,而之后又去模3,且都跳过for后面语句直接执行a++,所以,一直循环到b=22跳出for循环。此时a为8. 综合起来就是,每次循环b增加3,a增加1,且当b>22时跳出循环,结束程序。所以b从1增加到22,有(22-1)/3=7,所以a=1+7=8. 因此C选项正确。

 

31)设有一个M*N的矩阵已经存放在一个M行N列的数组x中,且有以下程序段

       sum=0;

       for(i=0;i<M;i++)  sum+=x[i][0]+x[i][N-1];

       for(j=1;j<N-1;j++) sum+=x[0][j]+x[M-1][j];

以上程序段计算的是

A) 矩阵两条对角线元素之和

B) 矩阵所有不靠边元素之和

C) 矩阵所有元素之和 

D) 矩阵所有靠边元素之和

答案:D

【解析】程序执行过程为:第一个for循环实现对第一列和第N列求和。第二个for循环在上一个for循环结果上实现对第一行和第M行从第二个元素到第N-1个元素的求和,总体来说,就是矩阵所有靠边元素之和,D选项正确。

32)若有以下程序

     #include <stdio.h>

     void fun(int  a[ ], int  n)

     {  int  t, i, j;

        for ( i=0;  i<n;  i+=2 )

           for ( j=i+2;  j<n;  j+=2 )

             if ( a[i] > a[j] ) {  t=a[i];  a[i]=a[j];  a[j]=t; }

     }

     main()

     {  int  c[10]={10,9,8,7,6,5,4,3,2,1},i;

        fun(c, 10);

        for ( i=0; i<10;  i++ )  printf("%d,", c[i]);

        printf("\n");

     }

则程序的输出结果是()。

A) 1,10,3,8,5,6,7,4,9,2,

B) 10,9,8,7,6,5,4,3,2,1,

C) 10,1,8,3,6,5,4,7,2,9,

D) 2,9,4,7,6,5,8,3,10,1,

答案:D

【解析】该题首先对一维数组进行初始化,c[0]到c[9]依次赋值为10到1;fun(c, 10);语句调用fun函数,fun函数的功能是将一维数组奇数位元素的数值由小到大排序;最后将排好序的新的一维数组进行输出。因此D选项正确。

33)若有以下程序

     #include <stdio.h>

     #define  N  4

     void fun( int  a[][N], int  b[], int  flag )

     {  int  i,j;

        for( i=0; i<N; i++ )

        {  b[i] = a[0][i];

           for( j=1; j<N; j++ )

              if (flag ? (b[i] > a[j][i]) : (b[i] < a[j][i]))       b[i] = a[j][i];

        }

     }

     main()

     {  int  x[N][N]={1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16}, y[N],i;

        fun(x, y, 1);

        for (i=0;i<N; i++)   printf("%d,", y[i]);

        fun(x, y, 0);

        for (i=0;i<N; i++)   printf("%d,", y[i]);

        printf("\n");

     }

则程序的输出结果是

A) 4,8,12,16,1,5,9,13,

B) 1,2,3,4,13,14,15,16,

C) 1,5,9,13,4,8,12,16,

D) 13,14,15,16,1,2,3,4,

答案:B

【解析】该题首先初始化二维数组,if (flag ? (b[i] > a[i][j]) : (b[i] < a[i][j]))条件语句的条件表达式使用了条件运算符构成的选择结构,即flag为真时,以(b[i] > a[i][j])作为条件表达式的值,否则以(b[i] < a[i][j])作为条件表达式的值,fun函数功能是给一维数组赋值。fun(x, y, 1);该函数调用后,即当flag为真时,使一维数组获得二维数组第1行的数值;fun(x, y, 0);该函数调用后,即当flag为假时,使一维数组获得二维数组第4行的数值;因此B选项正确。

 

34)有以下程序

#include <stdio.h>

void fun1(char *p)

{

    char  *q;

    q=p;

    while(*q!='\0')

    {  

        (*q)++;  

        q++;  

    }

}

main()

{

    char  a[]={"Program"}, *p;

    p=&a[3];  

    fun1(p);  

    printf("%s\n",a);

 

}

程序执行后的输出结果是()。

A) Prphsbn

B) Prohsbn

C) Progsbn

D) Program

答案:B

【解析】(*q)++是q所指的字符加1,q++就是指针移到下一个字符。因此B选项正确。

 

35)有以下程序

#include  <stdio.h>

#include  <string.h>

void  fun( char *s, int m1, int m2 )

{  char  t, *p;

   p=s + m1;  s= s+m2;

   while( s<p )

   {  t=*s;  *s=*p;  *p=t;

      s++;   p--;

   }

}

main()

{   char  ss[10]="012345678";

    int  n=6;

    fun( ss,0,n-1 );

    fun( ss,9,n );

    fun( ss,0,9 );

    printf("%s\n", ss );

}

程序运行后的输出结果是()。

A) 012345

B) 876543210

C) 876543

D) 012345678

答案:A

【解析】fun(*ss, m1, m2 )的作用是,如果m1>m2交换数组元素ss[m1],ss[m2]。因此,fun(ss,0,5)后ss的0,1,2,3,4,5,6,7,8,\0。fun(ss,9,6) 后ss的0,1,2,3,4,5, \0,8,7,6。fun(ss,0,9)后ss的0,1,2,3,4,5,\0,8,7,6。因此打印结果012345。故答案为A选项

36)有以下程序

#include   <stdio.h>

typedef  struct  stu {

                       char  name[10];

                       char  gender;

                       int  score;

                     } STU;

void  f( STU  a, STU  *b, STU  c )

{  *b = c =a;

   printf( "%s,%c,%d,", b->name, b->gender, b->score );

   printf( "%s,%c,%d,", c.name, c.gender, c.score );

}

main( )

{  STU  a={"Zhao", 'm', 290}, b={"Qian", 'f', 350}, c={"Sun", 'm', 370};

   f( a, &b, c );

   printf( "%s,%c,%d,", b.name, b.gender, b.score );

   printf( "%s,%c,%d\n", c.name, c.gender, c.score );

}

程序运行后的输出结果是()。

A) Zhao,m,290,Zhao,m,290,Zhao,m,290,Sun,m,370

B) Zhao,m,290,Zhao,m,290,Zhao,m,290,Zhao,m,290

C) Zhao,m,290,Zhao,m,290,Qian,f,350,Sun,m,370

D) Zhao,m,290,Zhao,m,290,Qian,f,350,Zhao,m,290

答案:A

【解析】C语言函数参数传递分为:1、值传递过程中,被调函数的形参作为被调函数的局部变量处理,即在内存的堆栈中开辟空间以存放由主调函数放进来的实参的值,从而成为了实参的一个拷贝。值传递的特点是被调函数对形参的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。

2、地址传递过程中,被调函数的形参虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。题设中,参数b是地址传递,因此会直接影响实参变量。a,c是值传递,传递是a,c的拷贝,不会a,c实参产生影响,因此,调用函数返回,c没有被修改,b被修改了。故答案为A选项。

37)有以下程序:

#include   <stdio.h>

#include   <stdlib.h>

int  fun(int   n)

{  int  *p;

  p = (int*)malloc(sizeof(int));

  *p=n;    return  *p;

}

main()

{  int   a;

  a = fun(10);    printf("%d\n",a+fun(10));

}

程序的运行结果是(  )。

A) 0

B) 10

C) 20

D) 出错

答案:C

【解析】malloc(sizeof(int))的作用是开辟一个长度为sizeof(int)存储空间,并通过强制类型转换(int*)将此存储空间的地址赋给了一个整型的指针变量p。然后执行语句*p=n,使得*p的值为10,并通过return返回此值,即a的值为10。然后在主函数中输出a+fun(10)=10+10=20。

38)有以下程序

#include <stdio.h>

#define f(x) x*x*x

main()

{  

    int a=3,s,t ;

    s=f(a+1);

    t=f((a+1));

    printf("%d,%d\n",s,t);

}程序运行后的输出结果是()。

A) 10,64

B) 10,10

C) 64,10

D) 64,64

答案:A

【解析】本题考查宏定义的用法,宏定义只是做个简单的替换,所以本题中执行f(a+1)=a+1*a+1*a+1=3*a+1=10,f((a+1))=(a+1)*(a+1)*(a+1)=64,所以答案为A选项。

39)有以下程序

#include   <stdio.h>

main( )

{

    int  i;

    FILE*  fp;

    for (i=0; i<3; i++)

    {

        fp = fopen("res.txt", "w");

        fputc('K' + i, fp);

        fclose(fp);

    }

}

程序运行后,在当前目录下会生成一个res.txt文件,其内容是()。

A) EOF

B) M

C) KLM

D) L

答案:B

【解析】for循环中,每次都执行打开文件res.txt、写入文件、再关闭文件的操作,由于fopen函数使用'w'模式写文件,所以每次打开res.txt后,都删除文件中的原有数据,再重新写入新数据。所以文件最终的内容只与最后一次for循环有关,最后一次for循环是向文件res.txt写入'K'+2, 即M,正确答案是B选项。

40)有以下程序

#include <stdio.h>

main( )

{  FILE *fp;

   int i, a[6] = {1,2,3,4,5,6}, k;

 

   fp = fopen("data.dat", "w+");

   fprintf(fp, "%d\n", a[0]);

   for (i=1; i<6; i++)

   {   rewind(fp);

       fprintf(fp, "%d\n", a[i]);

   }

   rewind(fp);

   fscanf(fp, "%d", &k);

   fclose(fp);

   printf("%d\n", k);

}

程序运行后的输出结果是()。

A) 6   

B) 21

C) 123456   

D)  654321

答案:A

【解析】本题首先定义文件指针变量fp和一个数组a[],再打开一个文件"data.dat",随后先给文件写入数据a[0],由于rewind函数是将文件指针从当前位置重新指向文件开始位置,所以for循环依次将数组a中的数据写入文件开始位置,退出循环后,文件中的数据顺序为:654321,重新使指针指向文件开始位置,将此时fp指向的数据(即文件中第一个数据6)写入变量k中,关闭文件,输出k值,答案为A选项。

转载于:https://www.cnblogs.com/chengtou/p/8615799.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值