第 2 章 常量、变量和表达式
生活随笔
收集整理的這篇文章主要介紹了
第 2 章 常量、变量和表达式
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
<一>繼續(xù)Hello World
深入了解C語言的注釋,注釋可以跨行,也可以穿插在程序中。注釋的定界符/*和*/,注釋需要注意兩點(diǎn):注釋不能夠嵌套使用,如:/*test1 /* test2 */ test3 */,編譯器解釋時(shí),只把/*test1 /*test 2*/看成注釋,后面的test3 */無法解釋錯(cuò)誤。2.C語言中也可以用//來注釋內(nèi)容,兩個(gè)/斜線(Slash)表示從這里直到該行末尾的所有字符都屬于注釋,這種注釋不能跨行,也不能穿插在一行代碼中間。這是從C++借鑒的語法。
#include <stdio.h> /*
?* comment1
?* main: generate some simple output
?*/
//這里跨四行在注釋里面的“*”號,沒有特殊含義,為了整體可觀賞性,這不是語法而是大家遵守的C代碼風(fēng)格(Coding Style)之一。
int main(void)
{
?printf(/* comment2 這里可以穿插程序注釋*/"Hello, world.\n"); /* comment3 可以在程序語句末尾穿插注釋*/
?return 0;
} 解釋C標(biāo)準(zhǔn)規(guī)定的轉(zhuǎn)義字符具體含義
\' 單引號'(Single Quote或Apostrophe)
\" 雙引號"
\? 問號?(Question Mark)
\\ 反斜線\(Backslash)
\a 響鈴(Alert或Bell)
\b 退格(Backspace)
\f 分頁符(Form Feed)
\n 換行(Line Feed)
\r 回車(Carriage Return)
\t 水平制表符(Horizontal Tab)
\v 垂直制表符(Vertical Tab) "Hello World.\n"這里雙引號(Double Quote)引起來的一串字符稱為字符串字面值(String Literal),或稱為字符串。printf打印出來的只是里面的一串字符Hello World,因此雙引號是字符串字面值的界定符。而\n沒有輸出。因?yàn)閈n這兩個(gè)字符合為一體表示換行(Line Feed),并不是字面意思。
如果在字符串字面值中要表示單引號和問號,既可以使用轉(zhuǎn)義序列\(zhòng)'和\?,也可以直接用字符'和?,而要表示\或"則必須使用轉(zhuǎn)義序列,因?yàn)閈字符表示轉(zhuǎn)義而不表示它的字面含義,"表示字符串的界定符而不表示它的字面含義。可見轉(zhuǎn)義序列有兩個(gè)作用:一是把普通字符轉(zhuǎn)義成特殊字符,例如把字母n轉(zhuǎn)義成換行符;二是把特殊字符轉(zhuǎn)義成普通字符,例如\和"是特殊字符,轉(zhuǎn)義后取它的字面值。C語言規(guī)定了幾個(gè)控制字符,不能用鍵盤直接輸入,因此采用\加字母的轉(zhuǎn)義序列表示。字符串字面值中的空格也算一個(gè)字符,也會出現(xiàn)在輸出結(jié)果中,而程序中別處的空格和Tab多一個(gè)少一個(gè)往往是無關(guān)緊要的,不會對編譯的結(jié)果產(chǎn)生任何影響。 #include <stdio.h>
int??????? main???????? (void)
//程序其他空格及Tab對程序無影響,但不是好的編程習(xí)慣
{
?printf("Hello,????? world.??? 0\n");
?//字符串字面值一個(gè)空格算一個(gè)字符。Hello,與World.間的空格及world.與0間的空格,照原樣輸出。
?return 0;
} 上面的程序也可以寫成:
#include <stdio.h>
int main(void){printf("Hello,????? world.??? 0\n");return 0;}
//不縮進(jìn)不會影響程序的結(jié)果,一個(gè)頭文件占一行,main后面多幾個(gè)空格也沒影響,但是int和main之間至少要有一個(gè)空格分隔開
<二>常量 常量(Constant)是程序中最基本的元素,有字符(Character)常量、整數(shù)(Integer)常量、浮點(diǎn)數(shù)(Floating Point)常量和 枚舉常量 #include <stdio.h>
int main(void)
{
??????? printf("character:%c\ncharater: %c\ncharater: %c\ncharater: %c\ncharater: %c\ncharater: %c\ncharater: %c\ncharater: %c\ninteger: %d\nfloating point: %f\n",'}','"','?','\n','\'','?','\'','\\',34,3.14);
??????? return 0;
}
字符常量要用單引號括起來,如:'{',注意但引號只能括一個(gè)字符而不能像雙引號那樣括一串字符,字符常量也可以是一個(gè)轉(zhuǎn)義序列,如:'\n'.這時(shí)雖然單引號括了兩個(gè)字符,但實(shí)際上只表示一個(gè)字符。和字符串字面值中使用轉(zhuǎn)義序列有一點(diǎn)區(qū)別,如果在字符常量中要表示雙引號"和問號?,既可以使用轉(zhuǎn)義序列\(zhòng)"和\?,也可以直接用字符"和?,而表示'和\則必須使用轉(zhuǎn)義序列。
printf中的第一個(gè)字符串稱為格式化字符串(Format String),它規(guī)定了后面幾個(gè)常量以何種格式插入到這個(gè)字符串中,在格式化字符串中%號(Percent Sign)后面加上字母c、d、f分別表示字符型、整型和浮點(diǎn)型的轉(zhuǎn)換說明(Conversion Specification),轉(zhuǎn)換說明只在格式化字符串中占個(gè)位置,并不出現(xiàn)在最終的打印結(jié)果中,這種用法通常叫做占位符(Placeholder)。這也是一種字面意思與真實(shí)意思不同的情況,但是轉(zhuǎn)換說明和轉(zhuǎn)義序列又有區(qū)別:轉(zhuǎn)義序列是編譯時(shí)處理的,而轉(zhuǎn)換說明是在運(yùn)行時(shí)調(diào)用printf函數(shù)處理的。源文件中的字符串字面值是"character: %c\ninteger: %d\nfloating point: %f\n",\n占兩個(gè)字符,而編譯之后保存在可執(zhí)行文件中的字符串是character: %c換行integer: %d換行floating point: %f換行,\n已經(jīng)被替換成一個(gè)換行符,而%c不變,然后在運(yùn)行時(shí)這個(gè)字符串被傳給printf,printf再把其中的%c、%d、%f解釋成轉(zhuǎn)換說明,雙引號括起來的是字符串,表示一串字符。單引號括起來的是字符,表示一個(gè)字符,除特殊的外。什么都不加的是一個(gè)整數(shù)。分別表示:"66666"、'6'、6 <三>變量
變量是計(jì)算機(jī)存儲器中的一塊命名空間,可以在里面存儲一個(gè)值(Value),存儲的值是隨時(shí)變的,比如這次存?zhèn)€字符'3'下次存?zhèn)€字符'4',正因?yàn)樽兞康闹惦S時(shí)變所以才叫變量。常量有不同的類型,因此變量也有不同的類型,變量的類型也決定了它所占的存儲空間的大小。例如:定義四個(gè)變量:a、b、c和d,a是字符占1個(gè)字節(jié)、b是整型2個(gè)字節(jié)、c和d是浮點(diǎn)型,c是單精度浮點(diǎn)型占4個(gè)字節(jié),d是雙精度浮點(diǎn)型占8個(gè)字節(jié)。變量的存儲單位是字節(jié)(Byte),在C語言中char型變量占一個(gè)字節(jié),其它類型的變量占多少個(gè)字節(jié)在不同平臺上有不同的規(guī)定
char a;
int b;
float c;
double d;
C語言中聲明(Declaration)有變量聲明、函數(shù)聲明和類型聲明三種。
變量的聲明及定義,給變量命名:變量命名建議用專業(yè)化術(shù)語,如:hour表示小時(shí)變量,minute表示分的變量。給變量命名的規(guī)則:C語言規(guī)定必須以字母或下劃線_(Underscore)開頭,后面可以跟若干個(gè)字母、數(shù)字、下劃線,但不能有其它字符。例如合法的變量名:Ac_bb、_12_、a_1_b123 ,不合法的變量名:$c、4_c、ab?_,a>b,C.C 等,其實(shí)這個(gè)規(guī)則不僅適用于變量名,也適用于所有可以由程序員起名的語法元素。同類型變量可以一起定義,如:int hour,minute;
注意:一般來說應(yīng)避免使用以下劃線開頭的標(biāo)識符,以下劃線開頭的標(biāo)識符只要不和C語言關(guān)鍵字沖突的都是合法的,但是往往被編譯器用作一些功能擴(kuò)展,C標(biāo)準(zhǔn)庫也定義了很多以下劃線開頭的標(biāo)識符,所以除非你對編譯器和C標(biāo)準(zhǔn)庫特別清楚,一般應(yīng)避免使用這種標(biāo)識符,以免造成命名沖突。 <四>賦值
定義變量,然后把值存到它們所表示的存儲空間里,可以用賦值(Assignmment)語句實(shí)現(xiàn):
char a; //定義一個(gè)字符變量a;
int hour,minute; //定義整型變量hour、minute
a = '3'; //給字符變量賦值,字符變量存儲空間的值為3
hour = 12; //分別給整型變量賦值,hour存儲空間的值為12,minute存儲空間的值為58
minute = 58; 注意:變量先聲明后使用,編譯器必須看到變量聲明,才知道a,hour,minute是變量名,各自代表一塊存儲空間。另外,變量聲明中的類型表明這個(gè)變量代表多大的一塊存儲空間,這樣編譯器才知道如何讀寫這塊存儲空間。這里的等號不表示數(shù)學(xué)里的相等關(guān)系,和1+1=2的等號是不一樣的,這里的等號表示賦值。在數(shù)學(xué)上不會有i=i+1這樣的等式成立,而在C語言中表示把變量i的存儲空間中的值取出來,再加上1,得到的結(jié)果在存回i的存儲空間中。總結(jié)一下:定義一個(gè)變量,就是分配一塊存儲空間并給它命名;給一個(gè)變量賦值,就是把一個(gè)值保存到這塊存儲空間中。變量的定義和賦值也可以一步完成,這稱為變量的初始化(Initialization)
char a = '4';
int hour = 13,minute = 28;
在初始化語句中,等號右邊的值叫做Initializer,注意:初始化是一種特殊的聲明,而不是一種賦值語句。變量賦的值必須符合它的類型,賦值和變量的類型不符導(dǎo)致編譯器報(bào)警或報(bào)錯(cuò)。
<五>表達(dá)式 常量和變量都可以參與加減乘除運(yùn)算,例如:1+1、 hour-1、hour * 60 + minute、minute/60等。這里的+-*/稱為運(yùn)算符(Operator),而參與運(yùn)算的常量和變量稱為操作數(shù)(Operand),上面四個(gè)由運(yùn)算符和操作數(shù)所組成的算式稱為表達(dá)式(Expression) 和數(shù)學(xué)上規(guī)定的一樣,hour * 60 + minute這個(gè)表達(dá)式應(yīng)該先算乘再算加,也就是說運(yùn)算符是有優(yōu)先級(Precedence)的,*和/是同一優(yōu)先級,+和-是同一優(yōu)先級,*和/的優(yōu)先級高于+和-。對于同一優(yōu)先級的運(yùn)算從左到右計(jì)算,如果不希望按默認(rèn)的優(yōu)先級計(jì)算則要加()括號(Parenthesis)。例如(3+4)*5/6應(yīng)先算3+4,再算*5,再算/6。 int total_minute,total;
total = total_minute = hour * 60 + minute;
計(jì)算順序是先算hour * 60 + minute得到一個(gè)結(jié)果,然后算右邊的等號,就是把hour * 60 + minute的結(jié)果賦給變量total_minute,這個(gè)結(jié)果同時(shí)也是整個(gè)表達(dá)式total_minute = hour * 60 + minute的值,再算左邊的等號,即把這個(gè)值再賦給變量total。同樣優(yōu)先級的運(yùn)算符是從左到右計(jì)算還是從右到左計(jì)算稱為運(yùn)算符的結(jié)合性(Associativity)。+ - * /是左結(jié)合的,等號是右結(jié)合的
在C語言中,等號左邊的表達(dá)式要求表示一個(gè)存儲位置,而不是一個(gè)值。注意:有的表達(dá)式既可以做左值也可以做右值,而有的表達(dá)式只能做右值。
了解語法樹,什么是語法樹?我個(gè)人理解,根據(jù)不同的語法規(guī)則,把復(fù)雜的程序簡單化,轉(zhuǎn)化成一個(gè)個(gè)替代符,然后再生產(chǎn)指令。
運(yùn)算符要求左右兩邊的操作數(shù)類型一致。C 語言規(guī)定了一套隱式類型轉(zhuǎn)換規(guī)則。 1、假設(shè)變量x和n是兩個(gè)正整數(shù),我們知道x/n這個(gè)表達(dá)式的結(jié)果要取Floor,例如x是17,n是4,則結(jié)果是4。如果希望結(jié)果取Ceiling應(yīng)該怎么寫表達(dá)式呢?例如x是17,n是4,則結(jié)果是5;x是16,n是4,則結(jié)果是4。
#include <stdio.h>
int main(void)
{
??????? int x,n,a,b,c;
??????? printf("Please input x and n numbers:\n"); /*提示輸入x和n的值*/
??????? scanf("%d%d",&x,&n); /*輸入兩個(gè)整型數(shù)值,&x,&n的地址*/
??????? a=x/n; /*x除以n取整,然后將值賦值給a*/
??????? b=x%n; /*取x除以n的余數(shù),然后將余數(shù)賦值給b*/
??????? if(b>=1&&b<=9) /*對余數(shù)判斷,如果不被整除,則取最大限度值,將a加1*/
??????? {
??????????????? c = a+1;
??????????????? printf("%d\n",c);
??????? }
??????? else /*如果被整除,結(jié)果按原樣輸出*/
??????? {
??????????????? c = a;
??????????????? printf("%d\n",c);
??????? }
????????????????????????????????????????????????????????????????????
??????? return 0;
}
<六>字符類型與字符編碼
字符常量或字符型變量也可以當(dāng)作整數(shù)參與運(yùn)算,例如:
printf("%c\n",'c'+2);
執(zhí)行結(jié)果輸出e
我們知道,符號在計(jì)算機(jī)內(nèi)部也用數(shù)字表示,每個(gè)字符在計(jì)算機(jī)內(nèi)部用一個(gè)整數(shù)表示,稱為字符編碼(Character Encoding),目前最常用的是ASCII碼(American Standard Code for Information Interchange,美國信息交換標(biāo)準(zhǔn)碼),ASCII碼中字符c是99,計(jì)算'c'+2這個(gè)表達(dá)式,應(yīng)該按ASCII碼把'c'當(dāng)作整數(shù)值99,然后加2得到101,然后printf把98這個(gè)整數(shù)值當(dāng)作ASCII碼來解釋,要求輸出的是字符,然后打印出整數(shù)值101對于ASCII碼的字符e。
參考《Linux C編程一站式學(xué)習(xí)》
深入了解C語言的注釋,注釋可以跨行,也可以穿插在程序中。注釋的定界符/*和*/,注釋需要注意兩點(diǎn):注釋不能夠嵌套使用,如:/*test1 /* test2 */ test3 */,編譯器解釋時(shí),只把/*test1 /*test 2*/看成注釋,后面的test3 */無法解釋錯(cuò)誤。2.C語言中也可以用//來注釋內(nèi)容,兩個(gè)/斜線(Slash)表示從這里直到該行末尾的所有字符都屬于注釋,這種注釋不能跨行,也不能穿插在一行代碼中間。這是從C++借鑒的語法。
#include <stdio.h> /*
?* comment1
?* main: generate some simple output
?*/
//這里跨四行在注釋里面的“*”號,沒有特殊含義,為了整體可觀賞性,這不是語法而是大家遵守的C代碼風(fēng)格(Coding Style)之一。
int main(void)
{
?printf(/* comment2 這里可以穿插程序注釋*/"Hello, world.\n"); /* comment3 可以在程序語句末尾穿插注釋*/
?return 0;
} 解釋C標(biāo)準(zhǔn)規(guī)定的轉(zhuǎn)義字符具體含義
\' 單引號'(Single Quote或Apostrophe)
\" 雙引號"
\? 問號?(Question Mark)
\\ 反斜線\(Backslash)
\a 響鈴(Alert或Bell)
\b 退格(Backspace)
\f 分頁符(Form Feed)
\n 換行(Line Feed)
\r 回車(Carriage Return)
\t 水平制表符(Horizontal Tab)
\v 垂直制表符(Vertical Tab) "Hello World.\n"這里雙引號(Double Quote)引起來的一串字符稱為字符串字面值(String Literal),或稱為字符串。printf打印出來的只是里面的一串字符Hello World,因此雙引號是字符串字面值的界定符。而\n沒有輸出。因?yàn)閈n這兩個(gè)字符合為一體表示換行(Line Feed),并不是字面意思。
如果在字符串字面值中要表示單引號和問號,既可以使用轉(zhuǎn)義序列\(zhòng)'和\?,也可以直接用字符'和?,而要表示\或"則必須使用轉(zhuǎn)義序列,因?yàn)閈字符表示轉(zhuǎn)義而不表示它的字面含義,"表示字符串的界定符而不表示它的字面含義。可見轉(zhuǎn)義序列有兩個(gè)作用:一是把普通字符轉(zhuǎn)義成特殊字符,例如把字母n轉(zhuǎn)義成換行符;二是把特殊字符轉(zhuǎn)義成普通字符,例如\和"是特殊字符,轉(zhuǎn)義后取它的字面值。C語言規(guī)定了幾個(gè)控制字符,不能用鍵盤直接輸入,因此采用\加字母的轉(zhuǎn)義序列表示。字符串字面值中的空格也算一個(gè)字符,也會出現(xiàn)在輸出結(jié)果中,而程序中別處的空格和Tab多一個(gè)少一個(gè)往往是無關(guān)緊要的,不會對編譯的結(jié)果產(chǎn)生任何影響。 #include <stdio.h>
int??????? main???????? (void)
//程序其他空格及Tab對程序無影響,但不是好的編程習(xí)慣
{
?printf("Hello,????? world.??? 0\n");
?//字符串字面值一個(gè)空格算一個(gè)字符。Hello,與World.間的空格及world.與0間的空格,照原樣輸出。
?return 0;
} 上面的程序也可以寫成:
#include <stdio.h>
int main(void){printf("Hello,????? world.??? 0\n");return 0;}
//不縮進(jìn)不會影響程序的結(jié)果,一個(gè)頭文件占一行,main后面多幾個(gè)空格也沒影響,但是int和main之間至少要有一個(gè)空格分隔開
<二>常量 常量(Constant)是程序中最基本的元素,有字符(Character)常量、整數(shù)(Integer)常量、浮點(diǎn)數(shù)(Floating Point)常量和 枚舉常量 #include <stdio.h>
int main(void)
{
??????? printf("character:%c\ncharater: %c\ncharater: %c\ncharater: %c\ncharater: %c\ncharater: %c\ncharater: %c\ncharater: %c\ninteger: %d\nfloating point: %f\n",'}','"','?','\n','\'','?','\'','\\',34,3.14);
??????? return 0;
}
字符常量要用單引號括起來,如:'{',注意但引號只能括一個(gè)字符而不能像雙引號那樣括一串字符,字符常量也可以是一個(gè)轉(zhuǎn)義序列,如:'\n'.這時(shí)雖然單引號括了兩個(gè)字符,但實(shí)際上只表示一個(gè)字符。和字符串字面值中使用轉(zhuǎn)義序列有一點(diǎn)區(qū)別,如果在字符常量中要表示雙引號"和問號?,既可以使用轉(zhuǎn)義序列\(zhòng)"和\?,也可以直接用字符"和?,而表示'和\則必須使用轉(zhuǎn)義序列。
printf中的第一個(gè)字符串稱為格式化字符串(Format String),它規(guī)定了后面幾個(gè)常量以何種格式插入到這個(gè)字符串中,在格式化字符串中%號(Percent Sign)后面加上字母c、d、f分別表示字符型、整型和浮點(diǎn)型的轉(zhuǎn)換說明(Conversion Specification),轉(zhuǎn)換說明只在格式化字符串中占個(gè)位置,并不出現(xiàn)在最終的打印結(jié)果中,這種用法通常叫做占位符(Placeholder)。這也是一種字面意思與真實(shí)意思不同的情況,但是轉(zhuǎn)換說明和轉(zhuǎn)義序列又有區(qū)別:轉(zhuǎn)義序列是編譯時(shí)處理的,而轉(zhuǎn)換說明是在運(yùn)行時(shí)調(diào)用printf函數(shù)處理的。源文件中的字符串字面值是"character: %c\ninteger: %d\nfloating point: %f\n",\n占兩個(gè)字符,而編譯之后保存在可執(zhí)行文件中的字符串是character: %c換行integer: %d換行floating point: %f換行,\n已經(jīng)被替換成一個(gè)換行符,而%c不變,然后在運(yùn)行時(shí)這個(gè)字符串被傳給printf,printf再把其中的%c、%d、%f解釋成轉(zhuǎn)換說明,雙引號括起來的是字符串,表示一串字符。單引號括起來的是字符,表示一個(gè)字符,除特殊的外。什么都不加的是一個(gè)整數(shù)。分別表示:"66666"、'6'、6 <三>變量
變量是計(jì)算機(jī)存儲器中的一塊命名空間,可以在里面存儲一個(gè)值(Value),存儲的值是隨時(shí)變的,比如這次存?zhèn)€字符'3'下次存?zhèn)€字符'4',正因?yàn)樽兞康闹惦S時(shí)變所以才叫變量。常量有不同的類型,因此變量也有不同的類型,變量的類型也決定了它所占的存儲空間的大小。例如:定義四個(gè)變量:a、b、c和d,a是字符占1個(gè)字節(jié)、b是整型2個(gè)字節(jié)、c和d是浮點(diǎn)型,c是單精度浮點(diǎn)型占4個(gè)字節(jié),d是雙精度浮點(diǎn)型占8個(gè)字節(jié)。變量的存儲單位是字節(jié)(Byte),在C語言中char型變量占一個(gè)字節(jié),其它類型的變量占多少個(gè)字節(jié)在不同平臺上有不同的規(guī)定
char a;
int b;
float c;
double d;
C語言中聲明(Declaration)有變量聲明、函數(shù)聲明和類型聲明三種。
變量的聲明及定義,給變量命名:變量命名建議用專業(yè)化術(shù)語,如:hour表示小時(shí)變量,minute表示分的變量。給變量命名的規(guī)則:C語言規(guī)定必須以字母或下劃線_(Underscore)開頭,后面可以跟若干個(gè)字母、數(shù)字、下劃線,但不能有其它字符。例如合法的變量名:Ac_bb、_12_、a_1_b123 ,不合法的變量名:$c、4_c、ab?_,a>b,C.C 等,其實(shí)這個(gè)規(guī)則不僅適用于變量名,也適用于所有可以由程序員起名的語法元素。同類型變量可以一起定義,如:int hour,minute;
注意:一般來說應(yīng)避免使用以下劃線開頭的標(biāo)識符,以下劃線開頭的標(biāo)識符只要不和C語言關(guān)鍵字沖突的都是合法的,但是往往被編譯器用作一些功能擴(kuò)展,C標(biāo)準(zhǔn)庫也定義了很多以下劃線開頭的標(biāo)識符,所以除非你對編譯器和C標(biāo)準(zhǔn)庫特別清楚,一般應(yīng)避免使用這種標(biāo)識符,以免造成命名沖突。 <四>賦值
定義變量,然后把值存到它們所表示的存儲空間里,可以用賦值(Assignmment)語句實(shí)現(xiàn):
char a; //定義一個(gè)字符變量a;
int hour,minute; //定義整型變量hour、minute
a = '3'; //給字符變量賦值,字符變量存儲空間的值為3
hour = 12; //分別給整型變量賦值,hour存儲空間的值為12,minute存儲空間的值為58
minute = 58; 注意:變量先聲明后使用,編譯器必須看到變量聲明,才知道a,hour,minute是變量名,各自代表一塊存儲空間。另外,變量聲明中的類型表明這個(gè)變量代表多大的一塊存儲空間,這樣編譯器才知道如何讀寫這塊存儲空間。這里的等號不表示數(shù)學(xué)里的相等關(guān)系,和1+1=2的等號是不一樣的,這里的等號表示賦值。在數(shù)學(xué)上不會有i=i+1這樣的等式成立,而在C語言中表示把變量i的存儲空間中的值取出來,再加上1,得到的結(jié)果在存回i的存儲空間中。總結(jié)一下:定義一個(gè)變量,就是分配一塊存儲空間并給它命名;給一個(gè)變量賦值,就是把一個(gè)值保存到這塊存儲空間中。變量的定義和賦值也可以一步完成,這稱為變量的初始化(Initialization)
char a = '4';
int hour = 13,minute = 28;
在初始化語句中,等號右邊的值叫做Initializer,注意:初始化是一種特殊的聲明,而不是一種賦值語句。變量賦的值必須符合它的類型,賦值和變量的類型不符導(dǎo)致編譯器報(bào)警或報(bào)錯(cuò)。
<五>表達(dá)式 常量和變量都可以參與加減乘除運(yùn)算,例如:1+1、 hour-1、hour * 60 + minute、minute/60等。這里的+-*/稱為運(yùn)算符(Operator),而參與運(yùn)算的常量和變量稱為操作數(shù)(Operand),上面四個(gè)由運(yùn)算符和操作數(shù)所組成的算式稱為表達(dá)式(Expression) 和數(shù)學(xué)上規(guī)定的一樣,hour * 60 + minute這個(gè)表達(dá)式應(yīng)該先算乘再算加,也就是說運(yùn)算符是有優(yōu)先級(Precedence)的,*和/是同一優(yōu)先級,+和-是同一優(yōu)先級,*和/的優(yōu)先級高于+和-。對于同一優(yōu)先級的運(yùn)算從左到右計(jì)算,如果不希望按默認(rèn)的優(yōu)先級計(jì)算則要加()括號(Parenthesis)。例如(3+4)*5/6應(yīng)先算3+4,再算*5,再算/6。 int total_minute,total;
total = total_minute = hour * 60 + minute;
計(jì)算順序是先算hour * 60 + minute得到一個(gè)結(jié)果,然后算右邊的等號,就是把hour * 60 + minute的結(jié)果賦給變量total_minute,這個(gè)結(jié)果同時(shí)也是整個(gè)表達(dá)式total_minute = hour * 60 + minute的值,再算左邊的等號,即把這個(gè)值再賦給變量total。同樣優(yōu)先級的運(yùn)算符是從左到右計(jì)算還是從右到左計(jì)算稱為運(yùn)算符的結(jié)合性(Associativity)。+ - * /是左結(jié)合的,等號是右結(jié)合的
在C語言中,等號左邊的表達(dá)式要求表示一個(gè)存儲位置,而不是一個(gè)值。注意:有的表達(dá)式既可以做左值也可以做右值,而有的表達(dá)式只能做右值。
了解語法樹,什么是語法樹?我個(gè)人理解,根據(jù)不同的語法規(guī)則,把復(fù)雜的程序簡單化,轉(zhuǎn)化成一個(gè)個(gè)替代符,然后再生產(chǎn)指令。
運(yùn)算符要求左右兩邊的操作數(shù)類型一致。C 語言規(guī)定了一套隱式類型轉(zhuǎn)換規(guī)則。 1、假設(shè)變量x和n是兩個(gè)正整數(shù),我們知道x/n這個(gè)表達(dá)式的結(jié)果要取Floor,例如x是17,n是4,則結(jié)果是4。如果希望結(jié)果取Ceiling應(yīng)該怎么寫表達(dá)式呢?例如x是17,n是4,則結(jié)果是5;x是16,n是4,則結(jié)果是4。
#include <stdio.h>
int main(void)
{
??????? int x,n,a,b,c;
??????? printf("Please input x and n numbers:\n"); /*提示輸入x和n的值*/
??????? scanf("%d%d",&x,&n); /*輸入兩個(gè)整型數(shù)值,&x,&n的地址*/
??????? a=x/n; /*x除以n取整,然后將值賦值給a*/
??????? b=x%n; /*取x除以n的余數(shù),然后將余數(shù)賦值給b*/
??????? if(b>=1&&b<=9) /*對余數(shù)判斷,如果不被整除,則取最大限度值,將a加1*/
??????? {
??????????????? c = a+1;
??????????????? printf("%d\n",c);
??????? }
??????? else /*如果被整除,結(jié)果按原樣輸出*/
??????? {
??????????????? c = a;
??????????????? printf("%d\n",c);
??????? }
????????????????????????????????????????????????????????????????????
??????? return 0;
}
<六>字符類型與字符編碼
字符常量或字符型變量也可以當(dāng)作整數(shù)參與運(yùn)算,例如:
printf("%c\n",'c'+2);
執(zhí)行結(jié)果輸出e
我們知道,符號在計(jì)算機(jī)內(nèi)部也用數(shù)字表示,每個(gè)字符在計(jì)算機(jī)內(nèi)部用一個(gè)整數(shù)表示,稱為字符編碼(Character Encoding),目前最常用的是ASCII碼(American Standard Code for Information Interchange,美國信息交換標(biāo)準(zhǔn)碼),ASCII碼中字符c是99,計(jì)算'c'+2這個(gè)表達(dá)式,應(yīng)該按ASCII碼把'c'當(dāng)作整數(shù)值99,然后加2得到101,然后printf把98這個(gè)整數(shù)值當(dāng)作ASCII碼來解釋,要求輸出的是字符,然后打印出整數(shù)值101對于ASCII碼的字符e。
參考《Linux C編程一站式學(xué)習(xí)》
轉(zhuǎn)載于:https://blog.51cto.com/chenboqiang/363789
總結(jié)
以上是生活随笔為你收集整理的第 2 章 常量、变量和表达式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle 10g OCP 042 题
- 下一篇: Tautology--POJ 3295