C语言程序设计笔记2:计算
这个系列是用来解决学校C语言课程的,并不适用于ACM和OI
本系列博客分为2部分,分别是 C语言程序设计笔记(网课) 和 课堂总结(线下课)
欢迎转载ssw02的博客:https://www.cnblogs.com/ssw02/p/15994555.html
C语言程序设计笔记2-1
1.常量和变量定义
上一章节末尾留了这么一个程序
#include <stdio.h>
int main()
{
int price = 0;
printf("请输入金额(元):");
scanf("%d", &price);
int change = 100 - price;
printf("找您%d元。\n", change);
return 0;
}
其中int price = 0
是一个先前没有见过的语句
翻译下:price是变量名称,int是指price的变量类型 , = 是赋值的意思, 0 则是给price赋的初值
现在我们来了解变量相关的定义:
变量代表了一个存储单元,其中的值是可以改变的
因为在一个程序中可能要使用到若干个变量,为了区别不同的变量,必须要给每个变量(存储单元)取一个名(变量名),该变量(存储单元)存储的值称为变量的值,变量中能够存储值的类型被称为比变量的类型
变量定义的一般形式为<类型名称><变量名称>
例如: int price
float price2
char A
但是变量名称并不是什么都可以,我们要避免使用一些特殊的名称,这个我们后面慢慢说
常量则是一个值不可改变的存储单元,在定义时加上const即可
e.gconst int price = 15;
如果在程序中尝试对已经初始化的常量(下面讲解)进行更改,一定会报错
2.赋值语句
在C和C++中,=
作为赋值运算符,并不表示“等于”的判断(等于是 == )
赋值语句则是有赋值表达式加上分号构成的表达式语句,一般形式为:变量 = 表达式 ;
, e.g price = 1024
右侧的表达式也可以为赋值表达式,既可以连续使用 =
e.g.a=b=c=d=1024;
等效于 d=1024;c=d;b=c;a=b;
,这里要注意顺序是从右到左依次赋值。
在进行赋值运算时,如果赋值运算符两边的数据类型不同,系统将自动进行数据类型的转换,在合法的情况下,将赋值运算符右侧的数据类型转换为左侧的数据类型。(不合法的话会出现错误)
但是刚接触C,还是尽量保证运算符两边的数据类型相同
3.变量初始化
常量一样同下。
一般形式为:<类型名称><变量名称>=<初始值>
比较一下int price = 5;
和int price;
我们发现后者是没有初值的,此时的price对应的值是申请变量时对应位置储存的值,应当是乱码,即一个未知的数字。
但是但是,如果我们的price定义为全局变量,还是会默认为0的初值;只有在定义为局部变量时才会出现一个未知的数字
运行一下下面两个程序就可以知道全局变量和局部变量的区别
#include <stdio.h>
int price;//全局变量
int main()
{
printf("%d",price);//输出结果为0
return 0;
}
#include <stdio.h>
int main()
{
int price;//局部变量
printf("%d",price);//输出结果为一个随机的数字
return 0;
}
习题代码:
int price, amount = 100, age;
那么price的初始值是? C
A.0
B.100
C.不确定
D.-1
4.定义变量和常量的位置
在C99标准下,我们只需要在使用某一变量或者常量之前定义即可。即全局变量(常量)或者函数内局部变量(常量)使用位置的上方。
但ANSI C标准下,要在开头先全部申明定义变量(常量)
5.格式化输入函数scanf
我们先介绍一个比较常用的读入函数scanf
f 的意思是formatical(格式化),可以先不管格式化什么意思
还是先举个例子 scanf("%d", &price);
大部分和printf()函数很类似,但一定要注意加上 & ,表示取地址,没有&会出各种问题
和printf()函数类似,scanf()函数也可以一次读入多个数据
例如scanf("%d%d",&a,&b);
就是先读入a再读入b
常见的scanf()函数的格式符:
d i 用于输入十进制整数
u 以无符号十进制形式输入十进制整数
o 用于输入八进制整数
x 用于输入十六进制整数
c 用于输入单个字符
s 用于输入字符串(非空格开始,空格结束,字符串变量以'\0'结尾)
f e 用于输入实数(小数或者指数均可)
附加格式 l 用于长整型 , 比如 lld ld lo lx lf
附加格式 h 用于短整型 , 比如 hd ho hx
6.习题答案
以下哪些是有效的变量名? A D
A.main
B.4ever 数字不放前面,ever4就可以
C.monkey-king 减号不合法
D.__int
2
给定:
int a,b;
scanf("%d %d", &a, &b);
则以下哪些输入方式是正确的? A C
A.1 2
B.1,2
C.1(回车)2
D.1、2
3
给定:
int a,b;
以下哪些scanf的使用是正确的? A B C
A.scanf("%d", &a);scanf("%d", &b);
B.scanf("%d %d", &a, &b);
C.scanf("%d, %d", &a, &b);
D.scanf("%d %d", a, b);
4
给定以下代码段:
int a,b=0;
则a的初始值是0 错误
5
写出下式的运算结果:10.0
10/3.0*3
6
写出下式的运算结果: 9.0
10/3*3.0
C语言程序设计笔记2-2
1.复合赋值
算数运算符+ - * / %
可以和 赋值运算符=
相结合,形成复合赋值运算符,即 += -= *= /= %=
e.g. price += 5;
和 price = price + 5;
两个语句等效
e.g. price *= Amount+2
和price = price*(Amount+2)
等效
注意优先级,先算赋值运算符右侧!
2.递增递减运算符
单目运算符 ++ 和 --
e.g.a++
和a=a+1
等效 a--
和a=a-1
等效
a++
被称为后缀形式,++a
被称为前缀形式,这两者有区别!!
a++
的结果是a+1以前的值 而++a
则是a+1以后的值
举个例子:若a=5; a++也是5,但执行之后a变为了6 ;若a=5; ++a却是6,执行后a也为6
3.习题答案
写出以下代码执行后,t1和t2的值,以空格隔开:
int a=14;
int t1 = a++;
int t2 = ++a;
//答案:14 16
写出以下表达式的结果,一个结果一行:
6 + 5 / 4 - 2
2 + 2 * (2 * 2 - 2) % 2 / 3
10 + 9 * ((8 + 7) % 6) + 5 * 4 % 3 * 2 + 3
1 + 2 + (3 + 4) * ((5 * 6 % 7 / 8) - 9) * 10
//答案:5 2 44 -627