第03數(shù)據(jù)類型與輸入輸出1_第1頁
第03數(shù)據(jù)類型與輸入輸出1_第2頁
第03數(shù)據(jù)類型與輸入輸出1_第3頁
第03數(shù)據(jù)類型與輸入輸出1_第4頁
第03數(shù)據(jù)類型與輸入輸出1_第5頁
已閱讀5頁,還剩60頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第3章基本數(shù)據(jù)類型與

數(shù)據(jù)的輸入輸出3.1C語言的基本數(shù)據(jù)類型簡介3.2標(biāo)識符、常量、變量3.3基本數(shù)據(jù)類型3.4數(shù)據(jù)的輸入與輸出13.1C語言的基本數(shù)據(jù)類型簡介數(shù)據(jù)類型基本類型構(gòu)造類型指針類型無值型(void)整型(int)字符型(char)實型(浮點型)枚舉類型(enum)單精度型(float)雙精度型(double)數(shù)組類型結(jié)構(gòu)體類型(struct)共用體類型(union)23.2標(biāo)識符、常量、變量3.2.1標(biāo)識符1標(biāo)識符標(biāo)識符:用來標(biāo)識變量名、函數(shù)名、數(shù)組名、類型名和文件名的有效字符序列。用戶定義標(biāo)識符時要注意以下規(guī)則:(1)標(biāo)識符由字母、數(shù)字、下劃線組成(2)數(shù)字不能打頭(3)標(biāo)識符區(qū)分大小寫如SUM與sum代表不同的標(biāo)識符。(4)不能用

C語言的關(guān)鍵字如char,int等關(guān)鍵字,已被C系統(tǒng)使用,不能用作變量名。3下面舉出幾個正確和不正確的標(biāo)識符:

正確不正確

smart5smart第一個字符不是字母或下劃線

_decisionbomb?含有非法字符?key_board

key.board

含有非法字符.FLOATfloat

不能用TurboC保留字

PIa+b含有非法字符“+”42標(biāo)識符的種類在TurboC中標(biāo)識符有以下三種:(1)關(guān)鍵字:所謂關(guān)鍵字就是已被TurboC2.0本身使用,不能作其它用途使用的字。(2)編譯預(yù)處理的命令單詞:如:#include、#define等。(3)用戶標(biāo)識符:用戶自己定義的變量名、常量名、函數(shù)名等。5由ANSI標(biāo)準(zhǔn)定義的TurboC2.0關(guān)鍵字有以下共32個:autodoubleint

struct

breakelselongswitchcaseenum

registertypedef

charexternreturnunionconstfloatshortunsignedcontinueforsignedvoiddefaultgoto

sizeof

volatiledoifwhilestatic63.2.2常量常量是指程序運行過程中不能變化的量,分為兩種:數(shù)值常量和字符常量。1數(shù)值常量數(shù)值常量有兩種:整型常量和實型常量,分別表示整數(shù)和實數(shù)(1)整型常量:如:207,30,181。有十進(jìn)制、八進(jìn)制、十六進(jìn)制等。7整型常量的三種形式:1)

十進(jìn)制整數(shù):如:12、0、-32)

八進(jìn)制整數(shù):如012=(10)10,017=(15)103)十六進(jìn)制整數(shù):如0x12=(18)100x1f=(31)10十六進(jìn)制數(shù)碼:0,1…9,a,b,……f8符號常量:用標(biāo)識符代表一常量。#define常量名整常數(shù)值#defineM30表示定義了一個符號常量M,它的值為309

例:#define

PI

3.1416main(){floats,r=2;s=PI

*r*r;

printf("area=%f",s);}10(2)實型常量帶小數(shù)點的數(shù)。實數(shù)的兩種形式:小數(shù)形式:例如:2.14

指數(shù)形式:例如:2.31e10表示2.31X1010實數(shù)的兩種類型:單精度(6~7位有效位數(shù))雙精度(15~16位有效位數(shù))112字符常量(1)用單引號括起來的一個字符:如'A'、'a'、'B'等。其實際值是字符的ASCII碼值。轉(zhuǎn)義字符:(見表3.1)是以\開頭的特殊字符。表示控制字符。如\n——換行

\t——跳格

\b——回退一格\r——回車表示特殊符號。如\'

、\"

、\\

等。例:printf("Isay:\"

Hello!\"

\n");結(jié)果顯示:Isay:"Hello!"\ddd(ddd表示3位八進(jìn)制數(shù)表示的ASCII碼),表示任何字符。\xhh(hh表示2位十六進(jìn)制表示的ASCII碼)表示任何字符。如'\x61'='\141'='a','\x41'='\101'='A','\012'

='\n'12例

轉(zhuǎn)義字符的使用main(){printf("ab\tcdefg\bhijk\n");printf("ABCDefg\rEFGH\012");

printf("c:\\exam\\test");}運行結(jié)果:ab

cdefhijkEFGHefgc:\exam\test例題演示133.2.3變量其值可以改變的量稱為變量。每個變量有名字,在內(nèi)存中占一定的存儲空間,用來存放數(shù)據(jù)。1變量定義類型名變量名列表;變量名列表例如:

inti,j,k;

longc;143.3基本數(shù)據(jù)類型整型(int)、實數(shù)類型(float或double)、字符型(char)。3.3.1整型(int)1整型變量定義〈整數(shù)類型〉〈變量名〉;有符號無符號按有無符號分長整數(shù)短整數(shù)按數(shù)據(jù)長短分15TurboC有幾種整型(int)數(shù)據(jù),見表3.2所示例如:定義幾個不同的變量。inta,b,c;unsignedintd,e;a,b,c取值范圍:-32768+32767。d,e兩個變量定義為無符號整數(shù),數(shù)值范圍:065535之間。類型簡寫字長說明數(shù)的范圍signedshortintshort或int,2字節(jié)有符號短整型數(shù)-32768~32767signedlongintlong4字節(jié)有符號長整型數(shù)-2147483648~2147483647unsignedshortintunsignedint2字節(jié)無符號短整型數(shù)0~65535unsignedlongintunsignedlong4字節(jié)無符號長整型數(shù)0~4294967295162整型數(shù)的存儲形式數(shù)據(jù)在內(nèi)存中以二進(jìn)制形式存放。一個int型數(shù)據(jù)占2字節(jié),即16位二進(jìn)制數(shù)位。一個longint型數(shù)據(jù)占4字節(jié).例:10(int型)的占位情況:00000000

00001010有符號數(shù):負(fù)數(shù)將以補碼形式存放。例:

-10的原碼:1000000000001010-10的補碼:1111111111110110符號位補碼=原碼取反+1173整型變量賦值及其說明(1)變量的初始化。

inta=3,b=100;

unsignedlongc=65535;(2)八進(jìn)制數(shù)、十六進(jìn)制數(shù).

intf=022;/*f的值是八進(jìn)制數(shù)22,即十進(jìn)制的18*/(3)在整型常數(shù)后添加一個"L"或"l"字母表示該數(shù)為長整型數(shù),如22L,773L。例如:longa=22L;如果表示為0773L表示該數(shù)為八進(jìn)制的長整型數(shù)183.3.2實數(shù)類型(float和double)有float、double類型。1實數(shù)類型變量定義<實數(shù)類型>〈變量列表〉;三種:單精度實數(shù)、雙精度實數(shù)和長雙精度實數(shù)。單精度實數(shù)(float)4字節(jié)6~7位有效數(shù)字雙精度實數(shù)(double)8字節(jié)15~16位有效數(shù)字長雙精度實數(shù)(longdouble)16字節(jié)18~19位有效數(shù)字19可以用下列語句定義實數(shù)類型變量:floata,f;doubleb;floata=12.5,f=0.12346;2實數(shù)類型的存儲形式實數(shù)類型在內(nèi)存中以指數(shù)形式存儲。例:float是單精度實數(shù)類型,占4字節(jié),內(nèi)存形式為:以高24位表示小數(shù)部分,最高位表示符號位;低8位代表指數(shù)部分。實數(shù)類型數(shù)3.1415926的存儲形式如圖3.2所示。0數(shù)符小數(shù)部分指數(shù)部分.31415926……

1

float類型內(nèi)存表示24位8位203實數(shù)類型變量賦初值及其說明例如:floata=29.56,f=-6.8e-18;

說明:(1)實數(shù)類型常數(shù)只有十進(jìn)制。(2)所有實數(shù)類型常數(shù)都被默認(rèn)為double型。(3)絕對值小于1的實型數(shù),其小數(shù)點前面的零可以省略。如:0.22可寫為.22,-0.0015E-3可寫為-.0015E-3。213.3.3字符型(char)1字符型變量的定義及存儲字符型變量定義形式如下:〈字符類型〉〈變量列表〉;字符類型數(shù)據(jù)可分為有符號和無符號有兩種類型。例如:chara;unsignedcharc;22字符型數(shù)據(jù)的存儲字符在計算機中以其ASCII碼方式表示,其長度占1個字節(jié)的存儲單元,有符號字符型數(shù)取值范圍為-128~127,無符號字符型數(shù)取值范圍是0~255。在TurboC語言中,字符型數(shù)據(jù)在操作時將按整型數(shù)處理,如果某個變量定義成char,則表明該變量是有符號的,即它將轉(zhuǎn)換成有符號的整型數(shù)(int)。23字符型數(shù)據(jù)的存儲例charc;chard1,d2;為變量賦值:d1='a';d2='b';d101100001d201100010將字符賦給變量,就是將字符的ASCII碼存放到變量所占的內(nèi)存單元中。24在字符型數(shù)的取值范圍內(nèi)字符型數(shù)據(jù)與整型數(shù)據(jù)之間可以通用。實際是對ASCII碼值進(jìn)行運算。例

main(){charc1,c2;c1=97;c2=98;

printf("%c,%c",c1,c2);

printf("%d,%d",c1,c2);}運行結(jié)果:a,b97,9825例:將小寫字母轉(zhuǎn)換為大寫形式。

main(){charc1,c2;c1='a';c2='b';相當(dāng)于c1=97;c2=98;c1=c1-32;相當(dāng)于c1=97-32=65;c2=c2-32;相當(dāng)于c2=98-32=66;

printf("%c%c",c1,c2);}運行結(jié)果:AB262字符變量的賦值及字符常數(shù)表示如'a','9','Z',也可用該字符的ASCII碼值表示。chara='A';chara=65;charc='\n';一些不能用符號表示的控制符,只能用ASCII碼值來表示,如:八進(jìn)制數(shù)033表示Esc27字符串常量字符串常量是一對雙引號括起來的字符序列。如:"computer""China""a“C規(guī)定:字符串的結(jié)尾有一個字符'\0'作為字符串的結(jié)束標(biāo)志(‘\0’的ASCII碼值為0)。

"a"實際存放形式是:

'a''\0',占兩個字節(jié)。charc;c="a";是錯誤的。C語言中沒有字符串變量,存放字符串只能存放在字符數(shù)組中。283.4數(shù)據(jù)的輸入與輸出輸入:指從外部輸入設(shè)備(如鍵盤)向計算機輸入數(shù)據(jù)。輸出:指計算機向外部輸出設(shè)備(如顯示器、打印機)輸出數(shù)據(jù)。

C語言中用庫函數(shù)實現(xiàn)數(shù)據(jù)的輸入輸出。C標(biāo)準(zhǔn)函數(shù)庫中提供了一些標(biāo)準(zhǔn)輸入輸出函數(shù)。如printf

、scanf、putchar、getchar、puts、gets

等。29使用庫函數(shù)時,要用預(yù)編譯命令#include<stdio.h>在頭文件中包含了與所調(diào)用函數(shù)有關(guān)的信息。如:putchar()getchar()303.4.1字符輸出函數(shù)函數(shù)的格式:putchar(ch);

將變量ch中的內(nèi)容以一個字符形式輸出到屏幕上。其中ch可以是字符型變量,也可以是整型變量,還可以是字符型常量或整型常量。31【例3.2】putchar()函數(shù)的使用/*C03_02.C*/#include<stdio.h>main(){charx='A',y='B';inti=97;putchar(x);putchar(y);putchar('C');putchar(i);putchar(98);putchar('!');/*輸出字符常量*/}程序的輸出結(jié)果如下:ABCab!32putchar()也可以輸出轉(zhuǎn)義控制字符。如putchar('\n');表示輸出換行符,即控制輸出位置換到下一行的開頭。#include<stdio.h>main(){charx='A',y='B';putchar(x);putchar('\t');putchar(y);putchar('\n');putchar('C');putchar('!');}程序的輸出結(jié)果如下:ABC!333.4.2字符輸入函數(shù)c=getchar();功能:接收從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)輸入的一個字符,并將該字符作為函數(shù)的值賦給變量c。【例3.3】輸入一個大寫字符,將其轉(zhuǎn)換成小寫并輸出。#include<stdio.h>main(){charc;

printf("Pleaseinputaletter:\n");c=getchar();/*輸入一個字符*/c=c+32;putchar(c);}運行結(jié)果如下:Pleaseinputaletter:Aa34使用getchar()函數(shù)應(yīng)注意以下兩點:(1)getchar()函數(shù)可以作為putchar()函數(shù)的參數(shù),putchar(getchar());(2)使用getchar()函數(shù)時,回車鍵也會作為輸入字符的一部分。尤其在連續(xù)使用getchar()函數(shù)時要注意回車鍵將會作為換行符被下一個getchar()所接受。35【例3.4】連續(xù)使用getchar()時應(yīng)注意的問題。/*C03_04.C*/#include<stdio.h>main(){charx,y;x=getchar();y=getchar();

putchar(x);putchar(y);}運行結(jié)果如下:A

A-

這是光標(biāo)的位置,是putchar(y);輸出的結(jié)果要想為x輸入字符A,為y輸入字符B,則輸入應(yīng)采用如下形式:AB輸出結(jié)果顯示:AB

363.4.3格式輸出函數(shù)printf("格式控制",輸出項列表);按某種格式,向輸出設(shè)備輸出若干個指定類型的數(shù)據(jù)。printf()函數(shù)的參數(shù)包括:格式控制和輸出項列表兩部分。格式控制部分要用一對雙撇號括起來,用于說明輸出項所采用的格式;輸出項列表是所要輸出的內(nèi)容,可以是變量、表達(dá)式、或常量。371格式控制格式控制部分又可分為:普通字符和格式說明兩部分。(1)普通字符(包括轉(zhuǎn)義控制字符),將原樣輸出。例:printf("China");

該例輸出普通字符串China例:printf("\tChina\n");\t輸出位置跳到下一個輸出區(qū)(一個輸出區(qū)為8個西文字符位置),然后輸出字符串,最后輸出控制字符'\n',控制換行。輸出結(jié)果如下:

China38(2)格式說明部分,以%開頭,以格式說明符結(jié)尾。用于控制輸出數(shù)據(jù)的類型和形式。例:printf("a=%db=%c

\n",a,b);普通字符格式說明輸出項列表若設(shè)a變量中的值是10,b變量的值是‘E’,則輸出結(jié)果是:a=10b=E格式控制中的各格式說明符與輸出項在個數(shù)、次序、類型方面必須一一對應(yīng)

39格式說明的一般格式如下:

%-m.nl格式說明符指定輸出項的類型附加說明符格式說明符:用單一字母表示,用來指定對應(yīng)輸出項的輸出格式,其含義如下。d-按十進(jìn)制有符號整型輸出o-以八進(jìn)制無符號整數(shù)輸出x-以十六進(jìn)制無符號整數(shù)輸出u-按十進(jìn)制無符號整型輸出c-以字符格式輸出,只輸出一個字符。s

-輸出字符串。f-以小數(shù)形式輸出單、雙精度數(shù),輸出6位小數(shù)。e-以標(biāo)準(zhǔn)指數(shù)形式輸出單、雙精度數(shù)。如:%d——按十進(jìn)制有符號整型數(shù)輸出

%f——以小數(shù)形式輸出單、雙精度數(shù),

40附加說明符的含義如下。l:用于輸出long型數(shù)據(jù),如%ld,%lum.n:指定輸出域?qū)捈熬?,m和n都是正整數(shù)-:左對齊輸出數(shù)據(jù)。412整型格式說明符(1)十進(jìn)制形式輸出%md:

控制輸出項按十進(jìn)制有符號整數(shù)形式輸出。m是一個整數(shù),用于指定輸出數(shù)據(jù)的最小占位寬度,若所輸出數(shù)據(jù)的位數(shù)少于m,左端(高位)將以空格占位;若輸出數(shù)據(jù)的位數(shù)大于m,則按數(shù)據(jù)的實際寬度輸出;若省略m則按所要輸出數(shù)據(jù)的實際長度輸出。如:inta=123,b=12345;printf("a=%4d,b=%4d\n",a,b);printf("sum=%8d",a+b);輸出結(jié)果為:a=123,b=12345Sum=1246842%mld:

格式中的“l(fā)”符號用于輸出long型數(shù)據(jù)。long型數(shù)不能用%d格式輸出。如:longa=123456;printf("%ld",a);輸出結(jié)果如下:123456printf("%8ld",a);的輸出結(jié)果為:12345643%-md或%-mld:“-”表示輸出數(shù)據(jù)左對齊。

inta=123;longb=12345;printf("%4d\n%-4d\n",a,a);printf("%8ld\n%-8ld\n",b,b);輸出結(jié)果為:123123

這是左對齊輸出的結(jié)果

123456123456

這是左對齊輸出的結(jié)果%mu或%mlu:控制輸出項按十進(jìn)制無符號整型數(shù)輸出。其中m和l的含義同前。44(2)八進(jìn)制形式%mo:控制輸出項按八進(jìn)制整數(shù)形式輸出。%mlo:按八進(jìn)制長整數(shù)形式輸出。(3)十六進(jìn)制形式%mx:按十六進(jìn)制整數(shù)形式輸出。%mlx:按十六進(jìn)制長整數(shù)形式輸出。45【例3.5】整型數(shù)據(jù)的輸出。#include<stdio.h>main(){unsignedinta=65534;printf("a=%d,%o,%x,%u\n",a,a,a,a);}運行結(jié)果:a=-2,177776,fffe,65534463實型格式說明符%f或%m.nf

:以小數(shù)形式輸出單、雙精度數(shù)據(jù)。m表示輸出的整個數(shù)據(jù)所占的列數(shù)(注意小數(shù)點占一列),含義如前所述;n表示輸出數(shù)據(jù)的小數(shù)部分的位數(shù),如果不指定n,則默認(rèn)輸出6位小數(shù)。%e或%m.ne

:以標(biāo)準(zhǔn)指數(shù)形式輸出單、雙精度數(shù)。m,n的含義如前所述。47【例3.6】實型數(shù)據(jù)的輸出。#include<stdio.h>main(){floatx=-2.5;doubley=31.416,z;z=x-y;

printf("x=%6.2f,%f,%.3f\n",x,x,x);

printf("y=%6.2f,%f,%-6.2f,\n",y,y,y);

printf("z=%e,%10.3e\n",z,z);}運行結(jié)果:x=-2.50,-2.500000,-2.500y=31.42,31.416000,31.42,z=-3.39160e+01,-3.391e+01484字符型格式說明符%c或%mc:輸出一個字符。例如:#include<stdio.h>main(){charch='B';printf("ch=%c,%3c\n",ch,ch+2);}輸出結(jié)果為:ch=B,D495字符串格式說明符格式說明符為:%—m.ns

格式中的m指輸出字符串占m列。若要輸出的字符串長度大于m,則不受m限制,全部輸出;若要輸出的字符串長度小于m,則左邊以空格占位補齊m位。n:用于指定輸出字符串左端截取n個字符。-:表示當(dāng)輸出的字符個數(shù)少于m時,輸出左對齊,右邊以空格占位補齊m位。50觀察下面程序段的運行結(jié)果:#include<stdio.h>main(){printf("%s","Student");}運行結(jié)果為:

Student51觀察下面程序段的運行結(jié)果:#include<stdio.h>main(){printf("%3s\n%5.2s\n%.4s\n%-5.3s\n","China","China","China","China");}運行結(jié)果:China

指定m為3,但實際字符串長度大于3,則不受m限制,全部輸出Ch

指定n為2,從字符串左端取2個字符輸出;m為5,輸出占5列(不夠則以空格占位)Chin

只指定了n為4,沒指定m,則自動使m為4。Chi

指定m為5,n為3,則取字符串左端3個字符,輸出占5列,且左對齊。52特殊符號的輸出要輸出某些特殊符號(如:\、"、'等),要用轉(zhuǎn)義字符形式輸出。例:要輸出字符串:Isay:"Hello!"

,其中“"”符號要用轉(zhuǎn)義形式輸出:printf("Isay:

\"Hello!\"

\n");例:要輸出字符串:C:\system\File1.txt,其中“\”符號要用轉(zhuǎn)義字符形式輸出:printf("C:\\system\\File1.txt\n");例:若想在輸出的字符串中,顯示有“%”號,要雙寫%號,printf("%.2f%%\n",100.0/4);運行結(jié)果為:25.00%533.4.4格式輸入函數(shù)函數(shù)的調(diào)用格式:

scanf("格式控制說明",地址列表);功能:接受鍵盤輸入的信息,按指定格式轉(zhuǎn)換后,存放到地址列表所對應(yīng)的變量中。1地址列表地址列表由若干個地址組成,它們可以是變量的地址也可以是字符串的首地址。變量的地址可以通過取地址運算符“&”得到。例如,變量a的地址表示為“&a”。2格式控制說明與printf類似,格式控制說明以%開頭,以格式說明符結(jié)束,中間可加入附加說明符。格式控制說明的一般格式為:

%*ml/h

格式說明符指定輸入項的類型附加說明符54常用的格式說明符及其含義如表3.7所示。常用的有:d輸入十進(jìn)制整型數(shù)c輸入一個字符。s輸入字符串。f輸入十進(jìn)制的小數(shù)形式或指數(shù)形式的實數(shù)附加說明符的含義如下l用于輸入long型數(shù)據(jù),如%ld,%lu;或輸入double型數(shù)據(jù),如%lfh用于輸入short型數(shù)據(jù),如%hd。m域?qū)捳f明,是一個正整數(shù),指出輸入數(shù)據(jù)所占列數(shù)。*表示本輸入項不賦給變量。55例如:scanf("%d",&a);該語句執(zhí)行的操作是將從鍵盤輸入的一個數(shù)據(jù)轉(zhuǎn)換成整型數(shù)(因為指定了%d格式)存放到a變量中。若要為變量b輸入單精度實數(shù),可用如下語句:scanf("%f",&b);若要為變量d輸入雙精度實數(shù),可用如下語句:scanf("%lf",&d);56【例3.7】任意輸入3個數(shù),求它們的平均值,并輸出結(jié)果。main(){floatx,y,z,ave;

printf("Pleaseinput3numbers:\n");/*顯示提示信息*/

scanf("%f",&x);/*輸入實數(shù)給x變量*/

scanf("%f",&y);

scanf("%f",&z);

ave=(x+y+z)/3.0;/*計算平均值*/

printf("x=%.2fy=%.2fz=%.2f\nave=%.2f\n",x,y,z,ave);}運行結(jié)果如下:Pleaseinput3numbers:1234567x=12.00y=34.00z=5

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論