基本知识点及分支循环的一些简单代码常见问题及易错点(附例题)
1.变量要赋初始值
题目:给定两个整数a和b (0 < a,b < 10,000),计算a除以b的整数商和余数。
注意:需要对变量a,b赋初值,再进行输入更加整洁和便于维护。
2.使用scanf()函数自行输入值
继续使用第一个例子来介绍scanf(用于读取用户的键盘输入)的基本用法。
2.1程序运行到这里时会停下来等用户输入数据并按下回车键后,然后存入变量;
2.2语法与printf相似;
2.3scanf()处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符等;
2.4常用占位符:
%c-字符
%d-整数
%f-float浮点数
%lf-double浮点数
%s-字符串。
注意1:变量前必须加上取地址&符号,指针变量除外。
注意2:不要在占位符后添加换行符\n。
3.while(scanf(“%d”, &n) != EOF)
#include <stdio.h>
int main() {
int a, b;
while (scanf("%d %d", &a, &b) != EOF) { // 注意 while 处理多个 case
// 64 位输出请用 printf("%lld") to
printf("%d\n", a + b);
}
return 0;
}
常见的直接输入格式只能输入一个值。
scanf()循环输入:它的返回值是一个整数,表示成功读取的变量个数;没有读取到返回0;读取失败返回EOF,则-1。
因此,通过使用上述while循环语句,可以一直输入值;结束使用ctrl+Z/ctrl+C。
4.if-else语句(顺序)
void game() {
int r = rand() % 100 + 1;
int g = 0;
int c = 5;
while (c) {
printf("还有%d次机会!", c);
printf("请猜数字: ");
scanf("%d", &g);
if (g > r)
printf("猜大了\n");
else if (g < r)
printf("猜小了\n");
else {
printf("猜对了!\n");
break;
}
c--;
}
}
问题:猜数字游戏。
使用判断语句if-else时注意逻辑清晰,大则>,小则<一一对应(尤其对于多分支或嵌套语句)。
注意:当问题不是“不是这样即为那样”的交叉关系时,可以连续使用多个if。
5.双等于号==和赋值号=
题目:说出上述代码的执行结果——死循环的打印5
由于进入循环后将5赋值给i,再继续执行i++使i=6,判断<10后又赋值为5,即一直死循环打印5。
因此在写代码时要注意区分判断语句双等于号==和赋值语句单等于号=,两者效果不同。
注意:可将两者调换方向写为"5=i",报错即可发现错误。
6.条件、循环语句大于一条时带大括号
问题:打印1-100之间所有3的倍数的数字。
为防止出现条件语句if-else匹配问题等,养成在编写代码时出现条件、循环语句后带上大括号{}的习惯,使得整体逻辑清晰,方便维护。
7.a++和++a(–同)
//后置++
int main()
{
int a = 5;
int b = a++;//先使用,再+1
//b=a, a=a+1
printf("a=%d b=%d\n", a, b);//a=6 b=5
return 0;
}
前置++:a=6 b=6
注意:当自增(减)运算符单独作用于一个变量时,前置和后置几乎无区别,当开始出现第二个变量后,前置表示先+1再使用,后置表示先使用再+1。
8.逗号表达式
像上图上这种语句,并非逗号表达式,若加上()即为逗号表达式。
逗号表达式:把表达式从左到右计算出来,然后把最右边的值作为最终值。
9.sizeof()和strlen()的区别
#include <stdio.h>
#include <string.h>
int main()
{
printf("%zd\n", sizeof(char));
short s = 2;
int b = 10;
printf("%zd\n", sizeof(s = b + 1));//2
}
sizeof(类型/表达式)(括号可去掉),其中表达式不运算,单位是字节。
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = {'b', 'i', 't'};
printf("%d\n", strlen(arr));
return 0;
}
打印结果为随机值。
strlen获取\0之前的字符串长度,单位是字符,空格也算是字符。
10.三种循环方式下break和continue的不同输出结果
break的作用是用于永久的终止循环,只要break被执行,直接就会跳出循环,继续往后执行;
continue的作用是跳过本次循环continue后边的代码,在for循环和while循环中有所差异的。
10.1 while 循环
int main()
{
//1~10
int i = 1;//初始化部分
while (i<=10) //判断部分
{
if (i == 5)
break;
printf("%d ", i);
i++;//调整部分
}
return 0;
}
输出结果为1 2 3 4 。
int main()
{
//1~10
int i = 1;//初始化部分
while (i<=10) //判断部分
{
if (i == 5)
continue;
printf("%d ", i);
i++;//调整部分
}
return 0;
}
由于跳过了调整部分,i一直为5,判断一直成立,从而造成1 2 3 4 死循环。
10.2 for 循环
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
输出结果为1 2 3 4 。
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
仅仅跳过了当这一个条件满足后的打印语句,输出结果为1 2 3 4 6 7 8 9 10 。
10.3 do while 循环(与while相似)
int main()
{
int i = 1;
do
{
if (i == 5)
break;//1 2 3 4
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}
int main()
{
int i = 1;
do
{
if (i == 5)
continue;//1 2 3 4 死循环
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}