當前位置:首頁 » 編程語言 » c語言的i開頭可以用什麼字元
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言的i開頭可以用什麼字元

發布時間: 2022-12-22 21:19:18

『壹』 c語言中的 i! 是什麼意思

首先,C語中的i肯定不是運算符,要麼是變數,要麼是字元
其次,!在C語言中是

運算符,並無其它含義,還是就是它字元,那也應該表示過\!
而i!表示i的階乘是數學的表示方法,語言里沒有這樣的運算符,要求i的階乘,必須用循環.
所以說i!單獨使用,C語言里肯定是語法錯誤,你要看看後面還跟著什麼
就是說:if
i不等於CC,write數組stu第i個元素.......
就是不等於的意思

『貳』 C語言編程里i的定義只能用int可不可以是double或float

可以。我不知道你的真正問題是啥,只能猜測,依據這個猜測給出可能很蠢的答案。 一般一個變數的定義由數據類型、變數名構成。數據類型就是變數的修飾,形容詞。 這個修飾詞的選擇不是隨意的。可能你看太多了程序中都有int i;這樣的語句。這只是巧合而已。這情況就像你看了很多文章中都有"紅色的花"這樣的句子,"紅色的花"可不是什麼規定、規則,花可以是藍色的或白色的.. 助於理解變數的概念,這里有個類比。C程序中創建變數就像創建容器,變數就是容器,可以裝東西;變數的數據類型就是容器的種類,比如衣服箱,水缸,這里以所裝東西的不同將容器分類。變數的名字是容器的名字,是容器的標簽。比如有多個水缸,如果程序中有一句是操作一個變數,說「將水缸放一升水」,那麼意思是不明確的,計算機和讀這個程序的人都不知道什麼意思,因為這里沒有說明是哪一個水缸,你可以將這些水缸某個起名A,然後再說「將A放一升水」。編程可以說是面向容器的,一般,程序處理的是抽象,不是具體東西。這樣程序才能夠復用。比如計算「兩個數的和」比計算「7+6」的程序更有意義。 所以你的問: i 的定義只能用int?可不可以是double或float?就像問:容器 i 只能是水杯?可不可以是盆或水缸? i 只是一個標簽而已。你可以將 i 這個字母用於指代任何一個容器。 另外,再說如何為變數名起個好名字。假如在某一個程序中, i 被很多地方引用到了,那麼 i 這個名字起得糟糕,因為還不知道i是什麼,是變數,還是函數,還是其它C語言元素?如果是變數,那也只知道有這么一個容器,是個衣服箱,但卻不知道是到底是放什麼衣服。在一個價格計算程序中,price這個名字更好,它比number、integer更好。這種如何為變數名起個好名字的說明,好像是多餘的。因為我們用了另一種語言,在日常語言中,你可能會說「這個衣服的價格」,而不會說「衣服的數字」,這里數字是什麼呢?價格還是尺碼,還是其它..其實C程序和自然語言沒很大區別。 C有很多表示數據類型,簡單數據類型有:char、int、float、double等;它們的含義:char表示單個字元,int表示基本整數,float表示單精度小數、double表示雙精度小數。在C程序中定義或聲明一個變數時,必須指定這個變數的數據類型,因為C是靜態、編譯型語言,它是強類型的,計算機要根據這些數據類型的信息確定一個變數在內存中的形式。比如char佔1位元組內存,int佔2位元組內存。 選擇哪一個合適,看你在特定情景的需求。例如要寫個計算金額的程序,則應該用float,因為在這個需求中錢都不是整數且最高是百萬(數值最高是7位數)。又例如要寫個菜單選擇程序,選項變數應該是字元,那麼應該選用char.

『叄』 在c語言中,str[i]為數字字元怎麼寫

至少兩個方法
一。
if
(str[i]>='0'
&&
str[i]<='9')

///數字字元
二。
if(isdigit(s[i]))

///
///數字字元
注意要含
ctype,h

『肆』 c語言中char string [i]中i是什麼意思

char string[i] 是一個字元數組
在首次定義時的[]中寫的數字是用來表示字元數組所包含的元素個數的
但是要注意字元數組在使用時下標是從0開始的,也就是說如果定義了一個char A[3]
那麼這個字元數組所包含的元素應為char A[0],char A[1]和char A[2].題目中給出的是一個未指定大小的字元數組,它當然也應該是從char A[0]開始為數組賦值,計算空格在內,所有的賦值如下
char A[0]=i,char A[1]="",char A[2]=a,char A[3]=m 故char A[3]=m

『伍』 在C語言程序中允許出現的字元集是什麼

C語言程序中允許出現的字元集:

1) 拉丁字母

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z

2) 十進制阿拉伯數字

0 1 2 3 4 5 6 7 8 9

3) 下面29個符號

! " # % & ' () * + , -. / :; < = > ? [ ] ^ _ { | } ~

4) 5種空白符

空格、水平製表符、垂直製表符、換行、換頁

5) 基本運行字元集還包括四個不可列印的字元:

null字元(用做字元串終止符)、警報(alert)、退格(backspace)、回車(carriage return)

為了在字母和字元串中表示這些字元,輸入反斜杠加對應的轉義序列(escape sequence)即可,例如,表示 null 字元(空字元),a表示警報,表示退格,而 表示回車。

不同的C實現版本中,字元實際對應的數值(字元碼)可能不同。C語言本身僅規定了以下規則:

  • 基本字元集中的每個字元必須用一個位元組(byte)表示。

  • 空字元是一個位元組,其所有的位(bit)都是0。

  • 0 之後的每個十進制數字,編碼都要依次比前者大 1。

『陸』 求大神整理c語言指令符號及用法大全。

編譯指令

編譯指令

說明

#include

包含另一個文件

#define

定義一個宏(macro)或是常量

#undef

取消一個宏常量的定義

#asm和#endasm

在程序中加入匯編語言的程序

#ifdef、#ifndef、#else、#endif

用於條件式的編譯

註解://—單行註解;
基本數據類型 (int,float,double,char,void)

數據類型

類型說明

長度(位)

數據長度

bit



1

0,1

char

字元

8

—128~127

unsigned char

無符號字元

8

0~255

signed char

有符號字元

8

—128~127

int

整型

16

—32768~32767

short int

短整型

16

—32768~32767

unsigned int

無符號整型

16

0~65535

signed int

有符號整型

16

—32768~32767

long int

長整型

32

—2147483648~2147483647

unsigned long int

無符號長整型

32

0~4294967295

signed long int

有符號長整形

32

—2147483648~2147483647

float

浮點數(實數)

32

0.175e-38~0.402e38

double

雙精度浮點

32

0.175e-38~0.402e38

void



0

沒任何數據

用戶自定義數據類型格式
typedef struct{
數據類型 變數序列1;
數據類型 變數序列1;
...
}自定義數據類型的名稱;
保留字
_at_,alien,bdata,break,bit,case,char,code,compact,const,continue,data,
default,do,double,far,else,enum,extern,float,for,goto,if,funcused,idata,int,
inline,interrupt,large,long,pdata,_priority_,reentrant,return,sbit,sfr,sfr16,
short,sigend,sizeof,small,static,struct,switchc_task_,typedef,using,union,
unsigned,void,volatile,while,xdata

常量表示法

常數

規則

範例

十進制

一般十進制格式

1234567890

二進制

開頭加上0b

0b00001110

八進制

開頭加上O

O0123

十六進制

開頭加上0x

0xFF45

無符號整數常量

結尾加上U

30000U

長整數常量

結尾加上L

299L

無符號長整數常量

結尾加上UL

327800UL

浮點數的常量

結尾加上F

4.234F

字元常量

以單引號括起來

『a』

字元串常量

以雙引號括起來

「hello」

-----------------------------------------------------運算符-----------------------------------------------------
算術運算

運算符

說明

範例

執行結果

+



c=a+b;

c 等於10





d=a—b;

d 等於6

*



e=a*b;

e 等於16

/



f=a/b;

f 等於4

%

取余數

g=a%b;

g 等於0

++

加1

c++;相當於c=c+1;

c 等於11

——

減1

d——;相當於d=d—1;

d 等於5

=

等於

a=8;

設置a等於8

+=

先相加在等於

e+=5;相當於e=e+5;

e 等於21

—=

先相減在等於

f—=5;相當於f=f—5;

f 等於—1

*=

先相乘在等於

b*=5;相當於b=b*5;

b 等於0

/=

先相除在等於

a/=5;相當於a=a/5;

a 等於1

%=

先取余數在等於

a%=5;相當於a=a%5;

a 等於3

※假設a等於8,b等於2
比較運算

運算符

說明

範例

執行結果

==

等於

a==5

F

!=

不等於

a!=5

T

<<o:p>

小於

a<5

F

>

大於

a>5

T

<=

小於等於

a<=5

F

>=

大於等於

a>=5

T

※比較運算結果是個布爾值既TRUE(真值)或FALSE(假值)。假設a等於8

邏輯運算

運算符

說明

範例

執行結果

&&

AND

(a>5)&&(a<10)

T

||

OR

(a<5)||(a>10)

F

!

NOT

!(a>10)

T

※邏輯運算結果是個布爾值既TRUE(真值)或FALSE(假值)。假設a等於8
位邏輯運算

運算符

說明

範例

執行結果

&

AND

a&0x01

a等於1

|

OR

a|0x80

a等於0x85

~

NOT

~a

a等於0xFA

^

XOR

a^0xFF

a等於0xFA

<<

左移

a<<1

a等於0x0A

>>

右移

a>>1

a等於0x0A

※假設a等於5
----------------------------------------------------控制命令---------------------------------------------------
if語句
if(條件) 語句1;
else 語句2;
例:if(d==4) d=0; //如果d等於4就設置d等於0
else d++; //否則就將d加1
if(ticks==0) { //如果ticks等於0
ticks=1000; //ticks 設置成1000
counter[0]++; //counter[0]加1
}

嵌套if語句
例:if(counter[0]==10) {
counter[1]++;
counter[0]=0;
if(counter[1]==10) {
counter[2]++;
counter[1]=0;
}
}

switch語句
switch (變數) {
case 常量1:語句1; break;
case 常量2:語句2; break;
case 常量3:語句3; break;
......
default ; 語句n;
}
for循環
for (初值,條件,變化值) 語句;
例:for(i=0;i<10;i++) x=x+i;
for(i=1;i<10,i++)
for(j=1;j<10,j++)
printf(「%d %d」,i,j);
無窮循環:
for( ; ; );

while循環
while (條件) 語句;
例:while (ch!=!』A』) ch=getche();
無窮循環:
while(1);

do/while循環
do {
語句;
...
} while(條件);
例:do {
ch=getche();
} while (ch!=」A」);

goto語句
loop1:
x++;
if(x<100) goto loop1;
----------------------------------------------------指針和函數------------------------------------------------
指針的定義
數據類型 *指針變數的名字;
例: char *p;
int *x;

指針與數組
例: char filename[80];
char *p;
p=filename; //指針p存放filename的開始地址

int x[5]={1,2,3,4,5};
int *p,sum,i;
p=x; //指針p存放數組x的開始地址
for(i=0;i<5;i++)
sum=sum+p[i]; //p[i]相當於x[i]

指針的運算
1.針變數前面加上*號就是取得指針所指向位置的內容。
例:int x[5]={1,2,3,4,5};
int *p;
p=x; //指針p存放數組x的開始地址
*p=10; //相當於設置x[0]等於10
2.變數前面加上&符號,可以取得一個變數的位置。
例:int x,y;
int *p;
p=&x; //指針p存放x的地址,相當於p是指向x 的指針
*p=1; //相當於設置x等於1
3.&符號也可以加在數組的前面
例:int x[5];
int *p;
p=&x[2]; //指針p存放x[2]的地址,相當於p是指向x[2]的指針
*p=50; //相當於設置x[2]等於50
函數
函數類型 函數名稱(參數序列);
參數說明
{
函數的主體
}
例:void delay (void) { //不返回任何數據的函數
unsigned char i,j; //沒有任何參數的函數
for(i=0,i<255,i++)
for(j=0,j<255,j++);
}
main()
{
...
delay(); //調用函數
}
例:unsigned char sum(unsigned chat a,unsigned chat b)
{
unsigned chat x;
check_GLCD_busyflag(); //函數中可以調用另一個函數
x=a+b;
return x; //return會返回x的數據
}
中斷服務函數
void 中斷服務程序的名稱(void) interrupt 中斷號碼using 寄存器組號碼
{
中斷服務子程序主體
}

中斷號碼
#define IE0_VECTOR 0 //0x03
#define TF0_VECTOR 1 //0x0B
#define IE1_VECTOR 2 //0x13
#define TF1_VECTOR 3 //0x1B
#define SIO_VECTOR 4 //0x23
對於S51有定時器2
#define TF2_VECTOR 5 //0x2B
例:static void xint0_isr(void) interrupt IE0_VECTOR(或0) using 1
{
unsigned char i,j=0xFF;
for(i=0,i<16,i++)
{
j++;
P1=j; //將數值輸出到P1口
delay_4isr();
}
}
-----------------------------------------------------匯編語言--------------------------------------------------
在C中加入匯編語言
例:void delay100us()
{
#pragma asm
mov r7,#1
more: mov r3,#48
djnz r3,$
djnz r7,more
#pragma endasm
}
----------------------------------------------------宏(macro)----------------------------------------------
宏的定義
%*define (macro名稱) (macro的指令)
例:%*define (write_1) (
setb DI
serb SK
clr SK
)

#define 宏的名稱 宏的指令
例:#define uchar unsigned char

C語言中的符號總結
運算符的種類C語言的運算符可分為以下幾類;
1. 算術運算符
用於各類數值運算,包括加減乘除求余自增自減共七種運算
{ ( + ) ,( - ),(* ) ,( / ) ,( % ),( ++ ),(-- )}。
2. 關系運算符
用於比較運算,包括大於(>),小於(<</span>),等於(==),大於等於(>=),
小於等於(<=),不等於(!=)共六種。
3.邏輯運算符
用於邏輯運算,包括與(&&)或(||)非(!)三種.
4.位操作運算符
參與運算的量,按二進制位進行運算,包括:
位與(&),位或(|),位非(~),為異或(^),左移(<<),右移(>>)共六種。
5.賦值運算符
用於賦值運算,分為:
簡單賦值(=)
復合算術賦值(+=,-=,*=,/=,%=)
復合位運算賦值(&=,|=,^=,>>=,<<=)三類共十一種。
6.條件運算符
這是一個三目運算符,用於條件求值(?:)。
7.逗號運算符
用於把若干表達式組合成一個表達式(,)。
8.指針運算符
用於取內容(*)和取地址(&)兩種運算。
9.求位元組數運算符
用於計算數據類型所佔用的位元組數(sizeof)。
10.特殊運算符
有括弧(),下標[],成員(→, .)

1.C的數據類型
基本類型,構造類型,指針類型,空類型
2.基本類型的分類及特點
類型說明符 位元組 數值范圍
字元型char 1 C字元集
基本整型int 2 -32768~32767
短整型short int 2 -32768~32767
長整型 long int 4 -214783648~214783647
無符號型 unsigned 2 0~65535
無符號長整型 unsigned long 4 0~4294967295
單精度實型 float 4 3/4E-38~3/4E+38
雙精度實型 double 8 1/7E-308~1/7E+308
3.常量後綴
L或l 長整型
U或u 無符號數
F或f 浮點數
4.常量類型
整數,長整數,無符號數,浮點數,字元,字元串,符號常數,轉義字元。
5.數據類型轉換
a自動轉換
在不同類型數據的混合運算中,由系統自動實現轉換, 由少位元組類型向多位元組類型轉換。 不同類型的量相互賦值時也由系統自動進行轉換,把賦值號右邊的類型轉換為左邊的類型。
b強制轉換
由強制轉換運算符完成轉換。
6.運算符優先順序和結合性
一般而言,單目運算符優先順序較高,賦值運算符優先順序低。 算術運算符優先順序較高,關系和邏輯運算符優先順序較低。 多數運算符具有左結合性,單目運算符、三目運算符、 賦值
7.表達式
表達式是由運算符連接常量、變數、函數所組成的式子。 每個表達式都有一個值和類型。 表達式求值按運算符的優先順序和結合性所規定的順序進行。

表示輸出類型的格式字元 格式字元意義
d 以十進制形式輸出帶符號整數(正數不輸出符號)
o 以八進制形式輸出無符號整數(不輸出前綴O)
x 以十六進制形式輸出無符號整數(不輸出前綴OX)
u 以十進制形式輸出無符號整數
f 以小數形式輸出單、雙精度實數
e 以指數形式輸出單、雙精度實數
g 以%f%e中較短的輸出寬度輸出單、雙精度實數
c 輸出單個字元
s 輸出字元串
標志字元為-、+、#、空格四種,其意義下表所示:
標志格式字元 標 志 意 義
- 結果左對齊,右邊填空格
+ 輸出符號(正號或負號)空格輸出值為正時冠以空格,為負時冠以負號
# 對c,s,d,u類無影響;對o類, 在輸出時加前
綴o 對x類,在輸出時加前綴0x;對e,g,f 類當結果有小數時才給出小數點
格式字元串

格式字元串的一般形式為: %[*][輸入數據寬度][長度]類型 其中有方括弧[]的項為任選項。各項的意義如下:
1.類型
表示輸入數據的類型,其格式符和意義下表所示。
格式 字元意義
d 輸入十進制整數
o 輸入八進制整數
x 輸入十六進制整數
u 輸入無符號十進制整數
f或e 輸入實型數(用小數形式或指數形式)
c 輸入單個字元
s 輸入字元串
轉義字元
轉義字元是一種特殊的字元常量。轉義字元以反斜線」\」開頭,後跟一個或幾個字元。轉義字元具有特定的含義,不同於字元原有的意義,故稱「轉義」字元。例如,在前面各例題printf函數的格式串中用到的「\n」就是一個轉義字元,其意義是「回車換行」。轉義字元主要用來表示那些用一般字元不便於表示的控制代碼。
常用的轉義字元及其含義
轉義字元 轉義字元的意義
\n 回車換行
\t 橫向跳到下一製表位置
\v 豎向跳格
\b 退格
\r 回車
\f 走紙換頁
\\ 反斜線符」\」
\』 單引號符
\a 鳴鈴
\ddd 1~3位八進制數所代表的字元
\xhh 1~2位十六進制數所代表的字元
廣義地講,C語言字元集中的任何一個字元均可用轉義字元來表示。表2.2中的\ddd和\xhh正是為此而提出的。ddd和hh分別為八進制和十六進制的ASCII代碼。如\101表示字?quot;A」 ,\102表示字母」B」,\134表示反斜線,\XOA表示換行等。轉義字元的使用
在C語言中,對變數的存儲類型說明有以下四種:
auto 自動變數
register 寄存器變數
extern 外部變數
static 靜態變數
自動變數和寄存器變數屬於動態存儲方式, 外部變數和靜態變數屬於靜態存儲方式。在介紹了變數的存儲類型之後, 可以知道對一個變數的說明不僅應說明其數據類型,還應說明其存儲類型。 因此變數說明的完整形式應為: 存儲類型說明符 數據類型說明符 變數名,變數名…; 例如:
static int a,b; 說明a,b為靜態類型變數
auto char c1,c2; 說明c1,c2為自動字元變數
static int a[5]={1,2,3,4,5}; 說明a為靜整型數組
extern int x,y; 說明x,y為外部整型變數
與指針有關的各種說明和意義見下表。
int *p; p為指向整型量的指針變數
int *p[n]; p為指針數組,由n個指向整型量的指針元素組成。
int (*p)[n]; p為指向整型二維數組的指針變數,二維數組的列數為n
int *p() p為返回指針值的函數,該指針指向整型量
int (*p)() p為指向函數的指針,該函數返回整型量
int **p p為一個指向另一指針的指針變數,該指針指向一個整型量。

指針變數的賦值
p可以有以下兩種方式:
(1)指針變數初始化的方法 int a;
int *p=&a;
(2)賦值語句的方法 int a;
int *p;
p=&a;

(1)取地址運算符&
(2)取內容運算符*

『柒』 C語言編程里i的定義只能用int可不可以是double或float

int是能用的,如果寫成unsignedlongint就錯了。vc中,定義unsignedlongint等於double.你寫int,double,float都對;

『捌』 C語言 i是什麼意思

i=0;a〔i〕!=′\0′;i++
一般在for語句中出現
i=0是為循環變數i賦初值
a(i)!='\0'是循環持續條件
i++是循環變數每次的變化,這里是每次遞增1

其中a(i)!='\0'表示a(i)不是截止符
在c中,字元串之後都會跟隨一個'\0'字元,表示字元串終止

『玖』 scanf中的格式字元i的用法

)的數據都是以ASCII碼存儲的(包括回車)。
程序1
#include "stdio.h"

void main()
{
char a;
char b;
scanf("%d",&a);
scanf("%d",&b);
printf("%d %d",a,b);
}

鍵盤輸入
97<回車>
第一次回車後,buffer中的ASCII:39h,37h,0AH(0A是換行的ASCII), scanf會根據格式字元串中的第一個%d對buffer按位元組順序讀取,當讀取到0A時,認為%d型的數據結束,此時把已經讀取到的39h,37h依據%d轉為整型數據97存儲在字元型變數a中。(這里是除去了掃描截止點0AH)
此時buffer中已經無任何數據了。

96<回車>
第二次回車後,按同樣的流程,scanf會根據格式字元串中的第二個%d對buffer按位元組順序讀取。最終b得到96.
此時buffer中已經無任何數據了。
輸出
97 96

程序2
#include "stdio.h"

void main()
{
char a;
char b;
scanf("%c",&a);
scanf("%c",&b);
printf("%d %d",a,b);
}

鍵盤輸入
9<回車>buffer:39H,0AH
因為scanf會按照第一個%c格式掃描buffer(只掃描一個位元組就結束),然後把掃描到的39H直接送到變數a(當以%d格式讀出來時,39H就是57)
此時,buffer中只有:0AH。
然後,scanft又遇到第二個%c,繼續掃描buffer,得到0aH並送入變數b.
此時buffer中已經無任何數據了

輸出
57 10

程序3
#include "stdio.h"

void main()
{
char a[100];
char b[100];
scanf("%s",a);
scanf("%s",b);
printf("%s %s",a,b);
}

鍵盤輸入
abc<回車>
第一次回車後,buffer:61H,62H,63H,0AH。
scanf會按照%s的格式對buffer按位元組順序掃描,當掃描到0AH時,結束掃描(按照%s的要求,空格20H也是掃描結束點)。
然後把掃描到的(除去最後一個判斷掃描截至的位元組0AH)數據直接送入以a為起始地址的字元串。
此時,buffer無任何數據了。

def<回車>
第二次回車後,buffer:65H,66H,67H,0AH.掃描的流程與上面的完全一致。
輸出
abc def

程序4
#include <stdio.h>
void main()
{
int i;
char j;
for(i=0;i<2;i++)
scanf("%c",&j);/*注意這里%前沒有空格*/
printf("%d",j);
}

鍵盤輸入
1<回車>,
這里scanf執行了兩次(i==0時,與i==1時),而且每次都是想對j賦值。
第一次scanf,按%c的要求,只掃描buffer中的一個位元組,但是buffer中並不數據,於是要求鍵盤輸入數據到buffer,此時的1<回車>代表向buffer中輸入了:31H,0AH。
然後按%c的要求,只掃描buffer中的一個位元組:31h,並將它直接送入變數j.
此時,buffer中還留下:0AH。

第二次scanf要求鍵盤輸入數據,按%c的要求,只掃描buffer中的一個位元組:0Ah,並將它直接送入變數j.
此時,buffer無數據了。

最後,你用%d格式輸出j的值(0AH換成整型就是10)

輸出
10

程序5
#include <stdio.h>
void main()
{
int i;
char j;
for(i=0;i<2;i++)
scanf(" %c",&j);/*注意這里%前有一個空格*/
printf("%d",j);
}
1<回車>2<enter>的情況:
scanf會按照格式控制字元串的要求,順序掃描buffer.
但是你其中有一個空格,這個很特殊,我也是第一次發現這個問題(一般我都不會在scanf中加入任何常量字元)

我測試了一下:我發現這個空格有吸收回車(0AH)和空格(20H)的「神奇功效」,吸收之後再要求buffer給一個位元組,直到這個位元組不是0AH或者 20H,此時把這個位元組交給下一個格式字串。

第一次循環時遇到格式字串空格,就掃描buffer中的一個位元組,但是buffer中無數據,要求從鍵盤輸入數據:1〈回車〉,buffer中有數據了——31H,0AH。再讀取到位元組31H,scanf發現這個並不是0AH/20H,就把這個位元組31H交給格式字元%c處理。
循環結束,此時buffer裡面還有:0AH.

第二次循環時遇到格式字串空格,就掃描buffer中的一個位元組——0AH,發現是0AH/20H,於是就要求buffer再來一個位元組。此時buffer裡面已經沒有數據了,要求鍵盤輸入:2<enter>.
buffer中有數據了——32H,0AH。於是再讀一個位元組31H,scanf發現這個並不是0AH/20H,就把這個位元組32H交給格式字元%c處理(j最終得到32H)。
循環結束,此時buffer裡面還有:0AH.

這里有一篇關於Printf的帖子:

程序6
#include "stdio.h"

void main()
{
int a;
int b;
scanf("%c",&a);
scanf("%c",&b);
printf("%d %d",a,b);
}

鍵盤輸入
1<回車>

問題5:

你的編譯器VC認為%d數據應該是4個位元組,但是你採用的是%c讀數據,
scanf("%c",&a);此句讀到的是1的ascii碼:31h.然後把31H直接送入地址&a(而並沒有改寫a的三個高位元組地址)。
scanf("%c",&b);同理。
你可以用printf("a=%x,b=%x\n",a,b);來驗證我說的。它們的最低位元組肯定是31H,0AH。

PS1:
當你把 int a;int b;放在main()外進行定義時,a,b的初值就是0。此時你會得到正確的結果。
當你把 int a;int b;放在main()內進行定義時,a,b不會被初始化(它們的三個三個高位元組地址的內容是不確定的),你就會得到上面錯誤的結果。(定義的動態變數都不會被初始化,靜態變數會被初始化為0)

PS2:以下也是不正確的用法。
char c;
scanf("%d",&c);/當你用%d給c賦值時,會對從&c開始的連續4個位元組進行賦值。當從buffer得到的值是在一個位元組范圍內(-128~127),下面是可以正常輸出的。但是不管怎樣,這樣做是很危險的——越界。
printf("%d",c);
=================請你測試下這個程序========================
#include "stdio.h"
void main()
{
char c[4],i=4;
scanf("%d",c);/*請輸入258<回車>*/

while(i-->0)
printf("%02x ",c[i]);
printf("\n");
}/*如果得到的結果是00 00 00 01 02就說明我的結論是正確的(258的轉為16進制數就是00 00 01 02H,然後scanf會把這個數放入以c為起始地址的)

================以下程序也是======================
#include "stdio.h"
void main()
{
char c,i=4;
char *p=&c;
scanf("%d",&c);/*請輸入258<回車>*/

while(i-->0)
printf("%02x ",p[i]);
printf("\n");
}

『拾』 c語言規定,標識符以什麼開頭可以由什麼構成的字元

字母和下劃線開頭,且標識符只能由字母數字和下劃線組成