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