前言
作为一名c语言萌新,在学习完c中的基本语句后,就能写出一些小的c语言程序了,但在写的过程中可能总是会碰到一些小地方困扰着你,因此我决定写下这篇文章记录下我遇到的一些小问题帮助你查漏补缺,并扫清那些你记忆中模棱两可的地方。
一.Switch与case
请问以下代码在屏幕上输出什么?
#include<stdio.h>
int main()
{
int n = 1;
switch (n)
{
case 1:
printf("%d ", 1);
case 2:
printf("%d ", 2);
case 3:
printf("%d ", 3);
}
}
答案:
1 2 3
解答:
小小开胃菜,相信大部分朋友都能答上来。
switch语句在执行中当某条case语句满足条件后,不仅执行当前case语句的内容,而是后面的每条case语句都将被执行,且跳过判断。因此在使用switch语句时一定要加上break语句以保证在执行了当前case语句后跳出,而不再往后执行,从而导致程序出错。
改进如下:
#include<stdio.h>
int main()
{
int n = 1;
switch (n)
{
case 1:
printf("%d ", 1);
break;
case 2:
printf("%d ", 2);
break;
case 3:
printf("%d ", 3);
break;
}
}
二.Switch与defualt
请问以下代码在屏幕上输出什么?
#include<stdio.h>
int main()
{
int n = 1;
switch (n)
{
case 1:
printf("%d ", 1);
case 2:
printf("%d ", 2);
default:
printf("%d ", 3);
}
}
答案:
1 2 3
解答:
一些朋友可能会稍微卡一下,但是还是能立马反应过来,defualt与case一样,如果没有适当加入break,只要前面有case执行了,后面的每一分支内的语句都会被执行,包括defualt语句。
三.while与scanf
请问以下代码的作用是什么?
while(scanf("%d",&n) != EOF)
{
;
{
答案:
循环输入内容到n中直到遇到EOF。
解答:
EOF(End Of File),在c语言标准库中表示文件结束符,也代表-1,如果想手动输入EOF的话,需要使用<ctrl+z>并按下enter输入,整个语句所要表达的意思也就是当你在输入文件结束标志时才会使语句停止,这样的语句常在牛客网的题目中使用,当题目要求你有多组输入,并且没有明确到底输入多少组时,使用这样的语句是一个非常棒的写法。
四.sizeof与strlen
请问以下代码在屏幕中输出什么?
#include<stdio.h>
int main()
{
char arr[] = "abcde";
printf("%d ", strlen(arr));
printf("%d", sizeof(arr));
return 0;
}
答案:
5 6
解答:
要解答这个问题的答案需要先知道arr数组在内存中如何存放的:
当你在数组中存放字符串时,会将你的每个字符依次存放到其中,并在最后放上一个‘\0’,以标志字符串的结尾。
strlen:
strlen计算的是从字符串第一个字符到‘\0’字符前的长度(不包括'\0') !!!!
szieof:
sizeof计算的是从字符串第一个字符到‘\0’字符的长度(即包含‘\0’)!!!!
这下,你应该就能明白strlen和sizeof的区别了吧。
五.arr与&arr
前面的太简单?接下来看这道题。
请问以下代码在屏幕上输出什么?
#include<stdio.h>
int main()
{
int a[5] = { 1,2,3,4,5 };
printf("%d ", *a);
printf("%d ", *(int*)(&a));
printf("%d ", *(a + 1));
printf("%d ", *(int*)(&a+1));
}
答案:
1 1 2 随机数
解答:
要想知道为什么我们首先来看前两个printf语句:
printf("%d ", *a); //打印a地址处的内容
printf("%d ", *(int*)(&a)); //打印&a地址处的内容
这两者看起来似乎是没有区别,那我们来试着打印这两个地方的地址就知道是否一样了:
#include<stdio.h>
int main()
{
int a[5] = { 1,2,3,4,5 };
printf("%p\n", a);// %p打印地址,就如同%d是打印整数一样的
printf("%p ", (int*)(&a));
}
输出:
00DEFB24
00DEFB24
看起来好像就是一个地址的嘛,但为什么当两者的地址都+1后输出截然不同呢,是笔者的代码出错了吗?其实不是:
在c语言中数组名a表示首元素地址,而取地址数组名&a表示整个数组地址。
当a的地址+1后就指向了数组的第二个元素即2,但当&a的地址+1后就指向了数组的最后即一个未开辟的未知空间,因此解引用后也就得到了一个随机数。这也是为什么需要将&a的地址强制转换为(int*)的类型,不然编译器根本不会把他当作一个int的类型输出。
----------------------------------- 复习题-----------------------------------------
#include<stdio.h>
#include<string.h>
int main()
{
int input = 1;
char arr[] = "abcdefg";
switch (input)
{
case 1:
printf("%d ", sizeof(arr));
printf("%d ", strlen(arr));
case 2:
printf("%c ", *(int*)&arr);
printf("%c ", *(int*)(&arr + 1));
printf("%c ", *arr);
printf("%c ", *(arr + 3));
break;
default:
printf("%d ", 100);
}
}
答案:
8 7 a 随机值 a d
答错了请再回去仔细看看哦!
总结
希望大家看了有所收获,总共5分,你得到了几分呢?如果你全部答对了,可以在评论区打出简单,以激励我写出更”难“的题来考验大家😘。