‘壹’ 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语言规定,标识符以什么开头可以由什么构成的字符
字母和下划线开头,且标识符只能由字母数字和下划线组成