目录
条件运算符(三目运算符)
表达式1?表达式2:表达式3;
运算法则:先判断表达式1是否成立,如果成立执行表达式2,否则执行表达式3;
int a=3,b=5;
int c=a>b?a++:++b;
//运行结果:c=6
运算符优先级(重要)
口诀:单算移关与,异或逻条赋
单目运算符 ++ --???! ???~
算术运算符 * / + -
移位运算符 << >>
关系运算符 < <= > >= == !=
位与运算符 &
异或运算符 ^ |
逻辑运算符 && ||
条件运算符 ? :
赋值运算符 = -= += *= /= %=
详细:
c语言笔试真题练习:
1.
答案:A
2.
标点符号
, ; () {} []
分隔符
空格 tab 换行
变量
概念:程序运行过程中会发生变化的量
格式:存储类型 数据类型 变量名
auto int
存储类型:决定变量存放的位置
数据类型:决定变量占用的空间大小
名称 | 字节大小 | 取值范围 | |
int | 整型 | 4 | -2^31~2^31-1 |
char | 字符型 | 1 | -2^7~2^7-1 |
short | 短整型 | 2 | |
long | 长整型 | 32位系统:4 64位系统:8 | |
float | 单精度浮点型 | 4 | 有效数据位数6~7位 |
double | 双精度浮点型 | 8 | 15~16位 |
char 1字节=8位 0-255 256个值 01111111=127
变量分类:全局变量、局部变量的区别?
局部变量 | 全局变量 | |
定义位置 | 函数内部 | 函数外部 |
初始值(不赋值) | 值:随机值 | 值:0 |
作用域 | 整个函数中都可以 | 整个程序中都可以 |
存储位置 | 栈区 | 全局存储区 |
生命周期 | 同整个函数共存亡 | 同整个程序共存亡 |
注意:同一个.c文件中,同一个局部变量可以和全局变量同名。取值为就近原则。
例如:
程序运行时占用的系统空间示意图:
c语言笔试真题练习:
1.
2.
3.
常量
程序运行过程中不会发生变化的量
指数常量
3*10^2------->3e2
2*10^5------->2e5
注意:e后面只能是整数,不能是小数。
字符型常量
用单引号包裹
char a='w';
'w'--->字符w
字符串常量
双引号包裹,有'\0'结束标志
"hello"---->'h' 'e' 'l' 'l' 'o'
对于字符串,'\0'是结束标志,标志不需要程序员手动补充,系统会自动补充,但是要考虑'\0'的存放空间。
char a[6]="hello";
'\n'===换行
\转义字符 n和\n不一样
'\x41' '\101' === 'A'
整型常量
int a=3; 存储到变量中
十进制、八进制、十六进制
浮点型常量
float double 一般用float多一点,占4字节,double占8字节
标识常量
格式:#define 宏名 表达式或常量或代码段
特点:只是单纯的替换,不进行运算
#include<stdio.h>
#define N 2
#define M N+3
#define NUM N+M/2+1
// 2+2+3/2+1
int main(int argc, char const *argv[])
{
printf("%d\n",NUM);
return 0;
}
宏定义:起标识作用
宏名:遵循标识符的命名规则,一般大写,为了和普通变量区分开
练习:结合宏定义用三目运算符实现求两个数的最大值
#include<stdio.h>
#define MAX a>b?a:b
int main(int argc, char const *argv[])
{
int a=6,b=2;
printf("%d\n",MAX);
return 0;
}
宏函数*(了解一下)
#include<stdio.h>
#define MAX(a,b) a>b?a:b
int main(int argc, char const *argv[])
{
printf("%d\n",MAX(6,2));
return 0;
}
c语言笔试真题练习:
输入输出
函数三要素:功能、参数、返回值
printf() 与 scanf() 函数:
printf()返回值:输出成功的字符数量
scanf()返回值:输入成功的字符数量
输出:printf
#include <stdio.h>
int printf(const char *format, ...);
功能:输出内容
参数:
1:字符串 如果包含格式则有后续参数
2:要和第一个参数中的格式对应
。。。。。。。
返回值:输出的字符的个数
输入scanf
int scanf(const char *format, ...);
功能:可以输入一些内容(从终端输入)
参数:
1:字符串(只写格式)
2:用来保存数据的变量的地址
。。。。。。。
返回值:正确输入的个数
scanf(“%s”,a);和gets(a)的区别
gets()和scanf()都可以用来输入字符串,但是它们的处理方式略有不同。gets()函数会读取一行字符串,直到遇到换行符为止,并将换行符替换为\0作为字符串的结尾。
而scanf()函数使用%s格式符读取字符串时,会在遇到空格、制表符或换行符时停止读取,并将这些字符留在输入缓冲区中,因此scanf()函数无法读取包含空格的字符串。
此外,每个字符串都以\0结尾,这是C语言中字符串的约定。
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("a=%d b=%d c=%d\n",a,b,c);
int a,b,c;
int ret=scanf("%d%d%d",&a,&b,&c);
printf("ret=%d\n",ret);
按字符输入输出
输入:
int getchar(void);
功能:从终端输入一个字符
参数:无
返回值:从终端输入的字符的ASCII值
int a=getchar();
printf("%d\n",a);
输出:
int putchar(int c);
功能:向终端输出一个字符
参数:要输出的字符的ASCII值
返回值:要输出的字 符的ASCII值
int a=getchar();
putchar(a);
大小写转换:
int a=getchar();
putchar(a+32);
练习:
#define sqrt(x) x*x //=2+3*2+3
sqrt(2+3)=11
答案:A
答案:D
答案:A B
易错题目:
答案:A C
注意:有符号和无符号进行计算 转成无符号
按格式输入输出
输出:
int printf(const char *format, ...);
功能:按照指定的格式向终端输出
参数:多参
返回值:输出字符个数
格式:
%d int
%c char
%f float
%lf double
%s 字符串
%#o “%o” 八进制
%#x “%x” 十六进制
%p 地址
%e 指数
int a=2;
printf("hello world %d\n",a);
c语言笔试练习:
输入:
int scanf(const char *format, ...);
功能:按格式向终端输入
参数:多参
返回值:正确输入数据的个数
当第一个数输入的格式不正确,会直接返回0
char a,b;
scanf("%c %c",&a,&b);
printf("hello world %c %c\n",a,b);
垃圾字符回收
- 通过空格回收
可以回收一个或多个空格、tab、换行
char a,b;
scanf("%c %c",&a,&b);
printf("%c %c\n",a,b);
2.%*c(了解)
只能回收任意一个字符 *是抑制符
3.getchar (用于循环语句中)
while(1)
{
char a;
scanf("%c",&a);
printf("%c\n",a);
getchar();
}
4.scanf("%[^\n]",a); //读取除换行符之外的所有字符
易错题目:
以下输出结果是:
int a;
a=(int) ((double)(3/2)+0.5+(int)1.99*2);
printf("a=%d\n",a);
答案:3
练习:
答案:2+1*2+1/2+1*2+1
分支结构
if_else switch_case
基本结构
if(表达式1)
{
代码段1;
}else
{
代码段2;
}
执行顺序:先判断表达式1是否成立,如果成立则执行代码段1,不成立则执行代码段2
if中的表达式也可写成数值 0为假,非0值为真
分层结构:
if(表达式1)
{
代码段1;
}else if(表达式2)
{
代码段2;
}else
{
代码段3;
}
c语言练习
输出三个数中最大的一个数
方法一:
if(a>b&&a>c)
max=a;
if(b>a&&b>c)
max=b;
if((c>a&&c>b)
max=c;
方法二:
max=a;
if(b>max)
max=b;
if(c>max)
max=c;
printf(“%d”,max);
方法三:
if(b<a)
{
a=a^b;
b=a^b;
a=a^b;
}
if(c<b)
{
c=c^b;
b=c^b;
c=c^b;
}
方法四:
if(a>b)
{
if(a>c)
max=a;
else
max=c;
}
else
{
if(c>b)
max=c;
else
max=b;
}
练习:
成绩等级划分:
100-90 A
89-80 B
79-70 C
<70
int s=99;
if(s>=90&&s<=100)
{
printf("A\n");
}else if(s>=80&&s<=89)
{
printf("B\n");
}else if(s>=70&&s<=79)
{
printf("C\n");
}else
{
printf("bukao\n");
}
嵌套结构:
if(表达式1)
{
if(表达式2)
{
代码段;
}
}
int s=999;
if(s<=100&&s>=0)
{
if(s>=90&&s<=100)
{
printf("A\n");
}else if(s>=80&&s<=89)
{
printf("B\n");
}else if(s>=70&&s<=79)
{
printf("C\n");
}else
{
printf("bukao\n");
}
}
注意:
if后边可以没有else,但是else前边必须有if
if和else代码段只有一句时,{}可以省略
练习:
答案:C
实现大小写转换
输入大写字母,输出小写字母
输入小写字母,输出大写字
输入其他,输出error
char a;
a=getchar();
if(a>='a'&&a<='z')
putchar(a-32);
else if(a>='A'&&a<='z')
putchar(a+32);
else
printf("error\n");
用switch
switch(变量或表达式)
{
case 常量1:语句块1;break;
case 常量2:语句块2;break;
case 常量3:语句块3;break;
...
case 常量n:语句块n;break;
default:语句块n+1;
}
执行顺序:判断switch后边的表达式的结果,和case后的常量进行匹配,如果匹配成功,就执行相对应的代码块,如果没有能匹配成功的就执行default后边的语句块,直到遇到break结束。
注意:
表达式的计算结果不能是小数,case后边的常量不能是浮点型或字符串
每个对应的case后需要加break,不加继续执行下一个case对应的语句块,直到遇到break
练习:
成绩等级划分:switch
100-90 A
89-80 B
79-70 C
<70 bukao
练习:从终端输入一个日期scanf ("% d -% d -% d "; year , mon , day ),判断这是这一年的第几天。
提示:判断闰年还是平年,闰年且闰年二月份以上比平年多一天