




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
易錯(cuò)點(diǎn)C語言中易犯的錯(cuò)誤對初學(xué)C語言的人來說,經(jīng)常會(huì)出一些連自己都不知道錯(cuò)在哪里的錯(cuò)誤.看著有錯(cuò)的程序,不知該如何改起,一些C編程時(shí)常犯的錯(cuò)誤,寫給各位學(xué)員以供參考.
****************************************************************************************
1.書寫標(biāo)識(shí)符時(shí),忽略了大小寫字母的區(qū)別.
main()
{
inta=5;
printf("%d",A);
}
編譯程序把a(bǔ)和A認(rèn)為是兩個(gè)不同的變量名,而顯示出錯(cuò)信息.
C認(rèn)為大寫字母和小寫字母是兩個(gè)不同的字符.習(xí)慣上,符號(hào)常量
名用大寫,變量名用小寫表示,以增加可讀性.
****************************************************************************************
2.忽略了變量的類型,進(jìn)行了不合法的運(yùn)算.
main()
{
floata,b;
printf("%d",a%b);
}
%是求余運(yùn)算,得到a/b的整余數(shù).整型變量a和b可以進(jìn)行求余
運(yùn)算,而實(shí)型變量則不允許進(jìn)行"求余"運(yùn)算.
****************************************************************************************
3.將字符常量與字符串常量混淆.
charc;
c="a";
在這里就混淆了字符常量與字符串常量,字符常量是由一對單
引號(hào)括起來的單個(gè)字符,字符串常量是一對雙引號(hào)括起來的字符序
列.C規(guī)定以"\"作字符串結(jié)束標(biāo)志,它是由系統(tǒng)自動(dòng)加上的,所
以字符串"a"實(shí)際上包含兩個(gè)字符:'a'和'\',而把它賦給一
個(gè)字符變量是不行的.
****************************************************************************************
4.忽略了"="與"=="的區(qū)別.
在許多高級語言中,用"="符號(hào)作為關(guān)系運(yùn)算符"等于".
如在BASIC程序中可以寫
if(a=3)then…
但C語言中,"="是賦值運(yùn)算符,"=="是關(guān)系運(yùn)算符.如:
if(a==3)a=b;
前者是進(jìn)行比較,a是否和3相等,后者表示如果a和3相等,把
b值賦給a.由于習(xí)慣問題,初學(xué)者往往會(huì)犯這樣的錯(cuò)誤.
****************************************************************************************
5.忘記加分號(hào).
分號(hào)是C語句中不可缺少的一部分,語句末尾必須有分號(hào).
a=1
b=2
編譯時(shí),編譯程序在"a=1"后面沒發(fā)現(xiàn)分號(hào),就把下一行"b
=2"也作為上一行語句的一部分,這就會(huì)出現(xiàn)語法錯(cuò)誤.改錯(cuò)時(shí),
有時(shí)在被指出有錯(cuò)的一行中未發(fā)現(xiàn)錯(cuò)誤,就需要看一下上一行是否
漏掉了分號(hào).
{
z=x+y;
t=z/100;
printf("%f",t);
}
對于復(fù)合語句來說,最后一個(gè)語句中最后的分號(hào)不能忽略不寫
****************************************************************************************
6.多加分號(hào).
對于一個(gè)復(fù)合語句,如:
{
z=x+y;
t=z/100;
printf("%f",t);
};
復(fù)合語句的花括號(hào)后不應(yīng)再加分號(hào),否則將會(huì)畫蛇添足.
又如:
if(a%3==0);
I++;
本是如果3整除a,則I加1.但由于if(a%3==0)后多加了分號(hào)
,則if語句到此結(jié)束,程序?qū)?zhí)行I++語句,不論3是否整除a,I都
將自動(dòng)加1.
再如:
for(I=0;I<5;I++);
{scanf("%d",&x);
printf("%d",x);}
本意是先后輸入5個(gè)數(shù),每輸入一個(gè)數(shù)后再將它輸出.由于for
()后多加了一個(gè)分號(hào),使循環(huán)體變?yōu)榭照Z句,此時(shí)只能輸入一個(gè)數(shù)
并輸出它.
****************************************************************************************
7.輸入變量時(shí)忘記加地址運(yùn)算符"&".
inta,b;
scanf("%d%d",a,b);
這是不合法的.Scanf函數(shù)的作用是:
intx,y;
{intz;
z=x>y?x:y;
return(z);
}試題一一、單項(xiàng)選擇題(共30分,每題1分)1.下列不正確的轉(zhuǎn)義字符是A.\\
B.\‘
C.074
D.\02.不是C語言提供的合法關(guān)鍵字是A.switch
B.cher
C.case
D.default3.正確的標(biāo)識(shí)符是(
)A.?a
B.a=2
C.a.3
D.a_34.下列字符中屬于鍵盤符號(hào)的是A.\
B.\n
C.\t
D.\b.下列數(shù)據(jù)中屬于“字符串常量”的A.ABC
B.“ABC”
C.‘ABC’
D.‘A’6.char型常量在內(nèi)存中存放的是A.ASCII碼
B.BCD碼
C.內(nèi)碼值
D.十進(jìn)制代碼值7.設(shè)a為5,執(zhí)行下列語句后,b的值不為2的是(
)A.b=a/2
B.b=6-(——a)
C.b=a%2
D.b=a>3?2:28.在以下一組運(yùn)算符中,優(yōu)先級最高的運(yùn)算符是(
)A.<=
B.=
C.%
D.&&9.設(shè)整型變量i的值為3,則計(jì)算表達(dá)式i——i后表達(dá)式的值是()A.0
B.1
C.
2
D.表達(dá)式出錯(cuò)10.設(shè)整型變量a,b,c均為2,表達(dá)式a+++b+++c++的結(jié)果是(
)A.6
B.9
C.8
D.表達(dá)式出錯(cuò)11.若已定義x和y為double類型,則表達(dá)式x=1,y=x+3/2的值是(
)A.1
B.2
C.2.0
D.2.512.設(shè)a=1,b=2,c=3,d=4,則表達(dá)式:a<b?a:c<d?a:d的結(jié)果是(
)A.4
B.3
C.2
D.113.設(shè)a為整型變量,不能正確表達(dá)數(shù)學(xué)關(guān)系:10<a<15的C語言表達(dá)式是()A.10<a<15
B.a==11||a==12||a==13||a==14C.a>10&&a<15
D.?。╝<=10)&&?。╝>=15)14.若有以下定義:chara、intb、floatc、doubled,則表達(dá)式a*b+d-c值的類型為()A.float
B.int
C.char
D.double15.表達(dá)式“10!=9”的值是(
)A.true
B.非零值
C.0
D.116.循環(huán)語句for(x=0,y=0;(y!=123)||(x<4);x++);的循環(huán)執(zhí)行(
)A.無限次
B.不確定次
C.4次
D.3次17.在C語言中,下列說法中正確的是(
)A.不能使用“dowhile”的循環(huán)B.“dowhile”的循環(huán)必須使用break語句退出循環(huán)C.“dowhile”的循環(huán)中,當(dāng)條件為非0時(shí)將結(jié)束循環(huán)D.“dowhile”的循環(huán)中,當(dāng)條件為0時(shí)將結(jié)束循環(huán)。18.設(shè)a,b為字符型變量,執(zhí)行scanf(“a=%c,b=%c”,&a,&b)后使a為‘A’,b為‘B’,從鍵盤上的正確輸入是(
)A.‘A’‘B’
B.‘A’,‘B’
C.A=A,B=B
D.a=A,b=B19.設(shè)i,j,k均為int型變量,執(zhí)行完下面的for循環(huán)后,k的值為(
)for(i=0,j=10;i<=j;i++,j——)k=i+j;A.10
B.9
C.8
D.720.設(shè)有定義:chars[12]={“string”};則printf(“%d\n”,strlen(s));的輸出是(
)A.6
B.7
C.11
D.1221.合法的數(shù)組定義是()A.inta[]={“string”};
B.inta[5]={0,1,2,3,4,5};C.chara={“string”};
D.chara[]={0,1,2,3,4,5}22.函數(shù)調(diào)用strcat(strcpy(str1,str2),str3)的功能是()A.將字符串str2復(fù)制到字符串str1中后再將字符串str3連接到字符串str1之后B.將字符串str1復(fù)制到字符串str2中后再連接到字符串str3之后C.將字符串str1復(fù)制到字符串str2中后再復(fù)制到字符串str3之后D.將字符串str2連接到字符串str1中后再將字符串str1復(fù)制到字符串str3中23.設(shè)有如下定義,則正確的敘述為(
)char
x[]={“abcdefg”};char
y[]={‘a(chǎn)’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g’};A.數(shù)組x和數(shù)組y等價(jià)
B.數(shù)組x和數(shù)組y的長度相同C.數(shù)組x的長度大于數(shù)組y的長度
D.數(shù)組x的長度小于數(shù)組y的長度24.設(shè)有單精度變量f,其值為13.8.執(zhí)行語句“n=((int)f)%3;”后,n的值是()A.4
B.1
C.4.333333
D.4.625.執(zhí)行語句“f=(3.0,4.0,5.0),(2.0,1.0,0.0);”后,單精度變量f的值是(
)A.3.0
B.5.0
C.2.0
D.0.026.設(shè)a、b均為整型變量,下列表達(dá)式中不是賦值表達(dá)式的是(
)A.a=3,4,5
B.a=3*2
C.a=a&&b
D.a=b=427.表達(dá)式“1?(0?3:2):(10?1:0)”的值為(
)A.3
B.2
C.1
D.028.sizeof(double)的結(jié)果值是(
)A.8
B.4
C.2
D.出錯(cuò)29.指出下面正確的輸入語句是(
)A.scanf(“a=b=%d”,&a,&b);
B.scanf(“a=%d,b=%f”,&m,&f);C.scanf(“%3c”,c);
D.scanf(“%5.2f,&f);30.若有以下定義和語句,且0<=i<5,則(
)是對數(shù)組元素地址的正確表示inta[]={1,2,3,4,5},*p,i;p=a;A.&(a+i)
B.&p
C.a++
D.&p[i]二、填空(20分,每空1分)1.在內(nèi)存中存儲(chǔ)“A”要占用(
)個(gè)字節(jié),存儲(chǔ)‘A’要占用(
)字節(jié)。2.符號(hào)常量的定義方法是(
)。3.能表述“20<x<30或x<-100”的C語言表達(dá)式是(
)。4.結(jié)構(gòu)化程序設(shè)計(jì)方法規(guī)定程序或程序段的結(jié)構(gòu)有三種:順序結(jié)構(gòu)、(
)和(
)。5.C語言共提供了三種用于實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的流程控制語句,它們是(
)、(
)和(
)。6.若在程序中用到“putchar”,應(yīng)在程序開頭寫上包含命令(
),若在程序中用到“strlen()”函數(shù)時(shí),應(yīng)在程序開頭寫上包含命令(
)。7.設(shè)有定義語句“staticinta[3][4]={{1},{2},{3}}”,則a[1][1]值為(
),a[2][1]的值為(
)。8.“*”稱為(
)運(yùn)算符,“&”稱為(
)運(yùn)算符。9.賦值表達(dá)式和賦值語句的區(qū)別在于有無(
)號(hào)。10.用{}把一些語句括起來稱為(
)語句11.設(shè)a=12、b=24、c=36,對于“scanf(”a=%d,b=%d,c=%d“,&a,&b,&c);”,輸入形式應(yīng)為(
)12.表達(dá)式“sqrt(s*(s-a)*(s-b)*(s-c));”對應(yīng)的數(shù)學(xué)式子為(
)13.C語言編繹系統(tǒng)在判斷一個(gè)量是否為“真”時(shí),以0代表“假”,以(
)代表“真”三、讀程序(30分)1.main(){inta=10,b=4,c=3;if(a<b)a=b;if(a<c)a=c;printf(“%d,%d,%d”,a,b,c);}2.main(){int
y=9;for(;y>0;y——)if(y%3==0){printf(“%d”,——y);continue;}3.main(){intx,y;for(y=1,x=1;y<=50;y++){if(x>=10)break;if(x%2==1){x+=5;continue;}x-=3;
}printf(“%d”,y)4.main(){staticinta[][3]={9,7,5,3,1,2,4,6,8};inti,j,s1=0,s2=0;i,j,s1=0,s2=0;for(i=0;i<3;i++)for(j=0;j<3;j++){if(i==j)s1=s1+a[i][j];if(i+j==2)s2=s2+a[i][j];}printf(“%d\n%d\n”,s1,s2);}5.main(){staticchara[]={‘*’,‘*’,‘*’,‘*’,‘*’};inti,j,k;for(i=0;i<5;i++){printf(“\n”);for(j=0;j<i;j++)printf(“%c”,‘
’);for(k=0;k<5;k++)printf(“%c”,a[k]);
}
}6.intfac(intn){staticintf=1;f=f*n;return(f);}main(){inti;for(i=1;i<=5;i++)printf(“%d!=%d\n”,i,fac(i));}四、編寫程序(20分)1.編一個(gè)程序,輸入X的值,按下列公式計(jì)算并輸出Y的值2.編程序按下列公式計(jì)算e的值(精度為1e-6)e=1+1/1!+1/2!+1/3!+……1/n!
參考答案:一、單項(xiàng)選擇題(共30分,每題1分)1.C
2.B
3.D
4.A
5.B
6.A
7.C
8.C
9.A
10.A
11.C
12.D
13.A
14.D
15.D
16.C
17.D
18.D
19.A
20.B
21.D
22.A
23.C
24.B
25.D
26.D
27.B
28.A
29.B
30.C;}二、填空(20分,每空1分)1.2,12.#define
符號(hào)常量
常量3.(x>20&&x<30)||x<-1004.分支結(jié)構(gòu),循環(huán)結(jié)果5.while
do
for6.#include
“stdio.h”
#include
“string.h”7.a[1][1]=0,a[2][1]=08.*指針運(yùn)算符,
&地址運(yùn)算符9.分號(hào);10.復(fù)合語句11.a=12,b=24,c=3613.非0三、讀程序(30分)1.結(jié)果:10,4,32.結(jié)果:8523.64.18105.*****6.5!=120四、編寫程序(20分1.Main(){intx,y;scanf(“%d”,&x);if(x<=1)y=x;(x<=1)y=x;elseif(x>1&&x<10)y=2*x-1;elsey=3*x-11;printf
(“x=%d,y=%d\n”,x,y);}bsp;
}2.Main(){floatE;intn;s=0;E=1;試題二一、單項(xiàng)選擇題(每小題2分,共50分)1、一個(gè)C程序的執(zhí)行是從___A__。A、本程序的main函數(shù)開始,到main函數(shù)結(jié)束B、本程序的main函數(shù)開始,到本程序文件的最后一個(gè)函數(shù)結(jié)束C、本程序文件的第一個(gè)函數(shù)開始,到本程序文件的最后一個(gè)函數(shù)結(jié)束D、本程序文件的第一個(gè)函數(shù)開始,到本程序main函數(shù)結(jié)束2、C語言程序的基本單位是___C___。A、程序行B、語句C、函數(shù)D、字符3、請選出可用作C語言用戶標(biāo)識(shí)符的一組標(biāo)識(shí)符___B___。A、voidB、a3_b3C、ForD、2adefine_123-abcDOWORDIFasesizeof4、假定x和y為double型,則表達(dá)式(x=2,y=x+5/2)的值是__C__。A、4.500000B、4C、4.000000D、2.0000005、下列可以正確表示字符型常量的是___D__。A、297B、"a"C、"\n"D、'\t'6、在C語言中,要求運(yùn)算數(shù)必須是整型的運(yùn)算符是__D__。A、/B、++C、*=D、%7、C語言中,復(fù)合語句的構(gòu)成是將一系列語句置于__C__。A、begin與end之間B、方框號(hào)“[]”之間C、花括號(hào)“{}”之間D、圓括號(hào)“()”之間8、有如下程序段,對應(yīng)正確的數(shù)據(jù)輸入是___A___。floatx,y;scanf(”%f%f”,&x,&y);printf(”a=%f,b=%f”,x,y);A、2.04<回車>B、2.04,5.67<回車>5.67<回車>C、A=2.04,B=5.67<回車>D、2.045.67<回車>9、以下程序段的輸出結(jié)果是___D__。inta=5678;printf(”%2d\n”,a);A、提示出錯(cuò)、無結(jié)果B、56C、78D、567810、已知:charch='A';則下列表達(dá)式的值是__B__。ch=(ch>='A'&&ch<='Z')?(ch+32):ch;A、AB、aC、ZD、z11、下列描述,正確的是___B__。A、表達(dá)式3.91%5是合法的B、用b=89作為while循環(huán)的條件是合法的C、逗號(hào)表達(dá)式是沒有值和類型的D、字符型變量和int型變量的操作完全不同12、閱讀以下程序:main(){intx;scanf("%d",&x);if(x--<5)printf("%d",x);elseprintf("%d",x++);}程序運(yùn)行后,如果從鍵盤上輸人5,則輸出結(jié)果是__B__。A、3B、4C、5D、613、下列程序的運(yùn)行結(jié)果是___C__。#include”stdio.h”main(){intk;k=3;switch(k){case1:printf(”%d\n”,k++);case2:printf(”%d\n”,k++);case3:printf(”%d\n”,k++);case4:printf(”%d\n”,k++);break;default:printf(”Full!\n”);}}A、3B、4C、3D、44414、設(shè)a、b、c、d、m、n均為int型變量,且a=5、b=6、c=7、d=8、m=2、n=1,則邏輯表達(dá)式(m==a<b)&&(n==c<d)的值為__A__。A、0B、1C、2D、315、設(shè)x、y和temp均為longint型變量,則以下語句:{temp=x;x=y;y=temp;}的功能是__D__。A、把x和y按從大到小排列B、把x和y按從小到大排列C、無確定結(jié)果D、交換變量x和變量y的值16、以下程序的輸出結(jié)果是___A__。main(){inta,b;for(a=1,b=1;a<=100;a++){if(b>=10)break;if(b%3==1){b+=3;continue;}}printf("%d\n",a);}A、4B、6C、5D、10117、執(zhí)行以下程序后輸出的結(jié)果是___D__。main(){inty=10;do{y--;}while(--y);printf("%d\n",y--);}A、-1B、1C、8D、018、執(zhí)行以下程序后輸出的結(jié)果是___B__。main(){inti,j,w=0;for(i=4;i;i--)for(j=1;j<=2;j++)w=w+i*j;w=i*j;printf("%d\n",w);}A、4B、0C、1D、3019、以下程序運(yùn)行后,輸出結(jié)果是__C__。main(){intn[5]={3,3,3},i,k=2;for(i=0;i<k;i++)n[i]=n[i]+1;printf("%d\n",n[k]);}A、4B、9C、3D、不確定的值20、以下程序的輸出結(jié)果是__A__。f(inta){intb=0;staticintc=3;b++;c++;return(a+b+c);}main(){inta=2,i;for(i=0;i<3;i++)printf("%d\n",f(a));}A、7B、7C、7D、78910791113721、設(shè)C程序如下:#defineABC(x)x*x#include"stdio.h"main(){inta=3,b;b=ABC(a+1);printf("b=%d",b);}上述程序運(yùn)行輸出的結(jié)果是__D_。A、b=4B、b=a+1C、b=16D、b=722、以下程序的輸出結(jié)果是__B__。main(){inti,a[10];for(i=9;i>=0;i--)a[i]=10-i;printf("%d%d%d",a[1],a[6],a[9]);}A、169B、941C、961D、35723、若定義:floatx=3.14159,*p=&x;則printf("%f\n",*p++);的輸出結(jié)果為__C__。A、無確定值B、x的地址C、3.14159D、4.1415924、以下程序的輸出結(jié)果是___B__main(){charb[]="Language";char*p=b;printf("%c",*(b+2));p=p+7;printf("%c\n",*p++);}A、27B、neC、agD、nu25、下列程序的輸出結(jié)果是___A__。#include"stdio.h"main(){inta[]={1,2,3,4,5,6,7,8,9,0},i,s,*p;p=a;s=0;for(i=0;i<=9;i++)s+=*p++;printf("%d\n",s);}A、45B、44C、0D、9二、判斷題(每小題1分,共10分)1.語句int*point;中的point是指針變量名。(T)2.主函數(shù)和其它函數(shù)之間可以相互調(diào)用。(F)3.puts()和gets()函數(shù)只能輸入或輸出一個(gè)字符。(F)4.可以對字符型數(shù)組元素進(jìn)行整體輸入、輸出。(T)5.do-while語句構(gòu)成的循環(huán)不能用其他語句構(gòu)成的循環(huán)來代替。(F)6.在一個(gè)函數(shù)內(nèi)的復(fù)合語句中定義的變量可以在本函數(shù)范圍內(nèi)有效。(F)7.函數(shù)必須有返回值,否則不能使用函數(shù)。(F)8.for(;;);語句相當(dāng)于while(1);語句。(T)9.C程序的執(zhí)行總是從第一個(gè)定義的函數(shù)開始。(F)10.C語言中的關(guān)鍵字專門用作語言的特定成分,而不能作為一般標(biāo)識(shí)符使用。(T)三、程序填空題(每空2分,共10分)1、下面程序完成判斷某一個(gè)數(shù)m是否為素?cái)?shù),如果是則輸出"misaprime!",否則就輸出"misnotaprime!",請選擇填空。main(){inti,m;scanf("m=%d",&m);for(i=2;i<m;i++){if(m%i==
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 江蘇省南通市示范中學(xué)2024-2025學(xué)年高三下學(xué)期模擬試題(二)英語試題含解析
- 西藏職業(yè)技術(shù)學(xué)院《婦產(chǎn)科護(hù)理學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 生物檢測試劑盒研發(fā)與市場推廣一體化合同
- 《數(shù)據(jù)分布與條形圖》課件
- 紀(jì)檢部門面試真題及答案
- 建筑電氣工程概論常用電氣設(shè)備教學(xué)課件
- 《康復(fù)評定》課件 - 輔助康復(fù)工作的新視角
- 《玉石磨刮操作》課件
- 《金屬案例解析》課件
- 《投資管理培訓(xùn)課件:企業(yè)融資途徑與資產(chǎn)證券化》
- 你畫我猜題目(課堂)課件
- 歐洲西部(西歐) 詳細(xì)版課件
- 淺圓倉倉頂鋼桁架結(jié)構(gòu)監(jiān)理實(shí)施細(xì)則
- 預(yù)應(yīng)力鋼絞線張拉伸長量計(jì)算程序單端(自動(dòng)版)
- 2022焊接大賽題庫含答案
- 新建鐵路晉豫段站前工程設(shè)計(jì)技術(shù)交底材料(站場)
- 物料管理入門練習(xí)作業(yè)答案
- 鐵路貨物運(yùn)輸品名分類與代碼表
- 江西省醫(yī)療機(jī)構(gòu)管理?xiàng)l例實(shí)施辦法(暫行)
- 1000MW機(jī)組鍋爐本體檢修規(guī)程
- 報(bào)考廣東警官學(xué)院考生政審表
評論
0/150
提交評論