助教:C语言有关问题收集-scanf()的一些常见有关问题;switch语句;for循环的执行顺序

助教:C语言问题收集--scanf()的一些常见问题;switch语句;for循环的执行顺序
scanf函数中的“格式控制”后面应当是变量地址,而不应是变量名。

输入数据时不能规定精度。
scanf("%7.2f",&a).这是不合法的。但是,scanf("%3d%3d",&a,&b)这样写可以。

如果在“格式控制”字符串中除了格式说明以外还有其他字符,则在输入数据时在对应位置应输入与这些字符相同的字符。
scanf("%d,%d,%d",&a,&b,&c);
输入:3,4,5
scanf("%d:%d:%d",&a,&b,&c);
输入:3:4:5
scanf("%d*%d*%d",&a,&b,&c);
输入:3*4*5

scanf("%2d %*3d %3d",&a,&b);
输入:(用#号表示空格)
12#345#67
则将12赋给a,%*3d表示读入3位整数但不赋给任何变量。然后再读入2位整数67赋给b。也就是说第2个数据“345”被跳过。
*号表示本输入项在读入后不赋给相应的变量。
如果在%后面有一个“*”附加说明符,表示跳过它指定的列数。
但是,*如果在%后面,比如:
scanf("%d*%d*%d",&a,&b,&c);
输入:3*4*5
这个时候的*号不会跳过一个指定列数的数据,在输入的时候,在对应的位置输入*号即可。

%lf与%f有什么不同。
l 用于输入长整型数据(可用%ld,%lo,%lx,%lu)以及double型数据(用%lf或%le)
double a;
scanf("%lf",&a);//不能用scanf("%f",&a);
printf("%lf",a);//也可以用printf("%f",a);
float b;
scanf("%f",&a);//不能用scanf("%lf",&a);
printf("%f",a);//也可以用printf("%lf",a);

return 0;表示什么意思?
函数的返回值,可以根据需要返回,不一定是0,当需要返回值且对返回值没有什么要求时,可以写return 0;

int i=123;unsigned n=456;double a=12.34567;
printf("%4d\t%7.4f\n\t%lu\n",i,a,n);
输出:(用#号表示空格)
#123####12.3457
########456
'\t'为水平制表符,占8位。

若有定义:float x=1.5;int a=1,b=3,c=2;则正确的switch语句是
A switch(x)
{case 1.0:printf("*\n");
case 2.0:printf("**\n");
}
B switch((int)x);
{case 1:printf("*\n");
case 2:printf("**\n");
}
C switch(a+b)
{case 1:printf("*\n");
case 2+1:printf("**\n");
}
D switch(a+b)
{case 1:printf("*\n");
case c:printf("**\n");
}
//switch后面的表达式必须是整数或者枚举类型。
//case后面的表达式必须为整型常量表达式。
//case后面的表达式必须为常量值。
//switch表达式后面不需要分号。
答案选C。

已知字母A的ASCII为65,一下程序运行后的输出结果为:
void main()
{
char a,b;
a='A'+'5'+'3';b=a+'6'-'2';
printf("%d,%c\n",a,b);}
'A','5','3','6','2'均是字符常量。转化为ASCII码值进行计算。
a='A'+'5'+'3'=65+53-51=67
b=a+'6'-'2'=67+54-50=71;(ASCII为71的字符是G)
输出:
67,G
在原来的题目的基础上,如果有:char c;c=a+'1';
则 c=a+'1'=67+49=116(ASCII为116的字符是t)

int *p;
p=NULL;p=0;p='\0';这三条语句含义相同,均表示p为0。值得注意:p的值为NULL与未对p赋值是两个不同的概念。前者是有值的(值为0),不指向任何变量,后者虽未对p赋值但不等于p无值,只是它的值是一个无法预料的值,也就是p可能指向一个事先未指定的单元。

for循环的执行顺序 
for循环的执行顺序用如下表达式:
  for(exp1;exp2;exp3)
 {   exp4; }
执行的顺序应该是:
1)第一次循环,即初始化循环。
首先执行表达式exp1(一般为初始化语句);再执行exp2(一般为条件判断语句),判断exp1是否符合exp2的条件;如果符合,则执行exp4,否则,停止执行;
2)第N(N>=2)次循环。
首先执行exp3,然后判断在exp3是否符合exp2的要求;如果符合,则继续执行在exp4,否则,停止执行。
总结:
总的来说,执行的顺序是一致的。先条件判断(exp2),再函数体执行(exp4),最后for执行(exp3)。往复。区别在于,条件判断的对象。第一次判断时,对象为初始化语句(exp1),而后面的判断对象为执行后的结果(exp3)。

printf();语句编译的时候是从右向左的。输出的时候再从左向右。


转义字符:

助教:C语言有关问题收集-scanf()的一些常见有关问题;switch语句;for循环的执行顺序

\a,响铃(BEL);\b,退格,将当前位置移到前一列;\n,换行,将当前位置移到下一行开头;\t,水平制表符,一般占八位;\r,回车,将当前位置移到本行开头。

程序运行如下:

#include<stdio.h>
int main(void)
{
	float salary;
	printf("\aEnter your desired monthly salary:");
	printf("$_______\b\b\b\b\b\b\b");
	scanf("%f",&salary);
	printf("\n\t%.2f a month is $%.2f a year.",salary,salary*12.0);
	printf("\rGee!\n");
	return 0;
}

运行初始状态:

助教:C语言有关问题收集-scanf()的一些常见有关问题;switch语句;for循环的执行顺序

输入数据:

助教:C语言有关问题收集-scanf()的一些常见有关问题;switch语句;for循环的执行顺序