一、算术运算:
+ 加
- 减
* 乘//区分数学上符号 和 c语言中的符号
/ 除
注:
1.除数不能为 0
2.两个整型数相除,结果相当于整除
% 取余
注:操作2 不能是 0 //除数不能为 0
eg:
1.判断奇数 偶数?
%2 ==> 1 奇数
==> 0 偶数
2.%N,其结果 在[0,N-1]区间
3. 求余的符号
取决于 左操作数
练习:
随机的抽出10套题
0~99
如果想抽到的是后面50道题
printf("ret = %ld\n",ret%50 + 50);
注:%50---->[0,49]---->+50---->[50,99]
知识点:随机数字
工具 --- c语言相关 函数库 提供的函数 (function-功能)
random();
long int random(void); //函数原型
功能: 调用一次,返回一个随机数
伪 随机数
void srandom(unsigned int seed);
功能:给 random 函数提供种子值,random函数会根据种子值的变化产生新的随机数
提供要给时间值
time_t time(time_t *tloc);
功能:该函数返回的是一个时间的秒数
eg:
time_t t = time(NULL);
强制类型转换:可以强制转换某些数据的类型
(类型)运算数 //将运算数对应的类型 强转 成 括号中的类型
注意:强制类型转换,对运算数本身不会产生影响。
eg:
1.2345;
1.2343; //1.234
思路:
1.2345
++: //自增运算 每次加1
++i //先++ ,后用
i++ //先用,后++
//注:
1. 先加后用,或者是先用后加,这个规则,只有在参与到别的运算中时,发挥作用。
2. 单独使用时,前置加加 和 后置加加,效果是一样的。
3. 运算数,必须是个左值
(const int a;//这里的a本身是左值,但是不能做++a,a++,原因是const修饰后,a成了只读变量)
op.c: In function ‘main’:
op.c:29:2: error: lvalue required as increment operand
++10;
op.c:30:4: error: lvalue required as increment operand
10++;
lvalue //left value --- 左值
左值:
int a;
a = 10; // 能放在 = 左边的值,叫做左值 --- 变量
右值:
只能放在等号右边 --- 常量
int a;
a = 10;
int b;
b = a;
constant //常量
const int a; //此时? a
lvalue (locationable value) //可定位的 ---可以获取到它的地址
&a //& 表示取地址 ---获取a对应的内存单元的编号(地址)
现在左值 和 右值:
能被定位到的 左值 --- 变量
不能被定位到的 右值 --- 常量 及 表达式
1+2 //匿名变量 (过程量)
eg:
int i = 1;
i++-3
(i++)-3
1-3 // = -2
运算符优先级和结合性:
1.优先级
一定是先结合的
优先级使用,是在不同级别的运算符混合运算时
i++-3 => (i++)-3
2.结合性
同一优先级
1+2-3
-- //自减运算 每次减一
注意:
printf("%d, %d\n" ,i,i++); //因为 i ++ ,++i 这个 自增改变的时间点,没有明确规定
总之,不要写出别人看不懂的、也不知道系统会怎样执行的程序。
i+++++i
贪心原则:从左到右逐个字符扫描,尽可能多的结合成c的运算符
i ++ ++ + i
((i++)++) + i
表达式 是一个右值 ?
++
i+++i // i++ +i
赋值运算符:=
int a;
a = 10 //赋值运算
int a = 10; //这个一般不当作赋值运算,只当作是初始化
int a,b,c;
a=b=c=1
a=b=(c=1)
c=1 //赋值运算表达式 //结果就是c中获得到的值
不同精度类型间的混合赋值
//长类型 <=>短类型
//整型
1. 长类型=>短类型 此时 高位截断
2. 短类型=>长类型
有符号 短类型 则 作符号位扩展
无符号 短类型 则 高位 补0
int a = 0x12345678;
short b = 0x1234;
a=b;
printf("b = %#x\n",b);
//高精度 和 低精度
float f = 1.23;
int a = f;
3. 浮点数 给到 整型变量中 ,此时 精度丢失(小数丢失)
int a = 1;
f = a;
+= // a += 1 <=> a = a + 1
-=
*=
/=
%=
a+=1 // a = (a + 1)
逗号运算:
,
连接多个表达式
表达式1,表达式2, ... ,表达式n
运算规则:
顺序求值运算
依次,求解表达式1到n
逗号表达式的结果是: 最后一个表达式求值的结果
eg:
int i = 0;
int sum = 0;
for (i = 1,sum = 1;...;...)
二、输入输出
语句
1.控制语句
if (a > b)
{
}
else
{
}
2.函数调用语句
printf() //函数调用
printf(); //函数调用语句
3.表达式语句
a+3 //表达式
a+3; //表达式语句
4.空语句
;
5.复合语句
{
z = x + y;
c = a + b;
}
输入输出
输入设备 --- 运算器 + 控制器 ----输出设备
存储器
输入 ---->内存---->输出
stdio //standard input output
函数:
单个字符
putchar getchar
格式化操作函数
prinf scanf
字符串操作 (*) //数组
puts / gets
单个字符:
putchar()
int putchar(int c); //形参 --形式参数 ---本身是一个变量
功能:
输出一个字符
参数:
@c 要输出的 字符的 ascii码值
返回值:
成功 返回输出了的字符的 ASCII的值
失败 EOF (实际是-1)
eg:
char c = 'a';
putchar(c); //输出c中ascii码值对应的字符
int getchar(void);
功能:
从键盘获取一个字符
参数:
void 表示空类型,在函数形参表示不许参数
返回值:
成功 返回读到了的字符的ASCII码值
失败 -1
eg:
int ret;
ret = getchar(); //ret将保存 getchar从键盘获得到的字符的ASCII码值
练习:
char c1;
将 hello 转换成大写输出
从键盘输入
输出?
putchar()
格式化操作函数:
printf //格式化输出函数
int printf(const char *format, ...); //... 表示可变参数 --参数的数量可以变
int printf(格式控制字符串,输出列表);
printf("a = %d\n",a);
格式控制字符串:
占位符 //将来要被 后面的参数值 替换掉 --格式转换
整型类型:
%d 以有符号十进制格式输出
%u 以无符号十进制格式输出
%o 以八进制格式输出
%x 以十六进制格式输出
%X 大写 表示 输出的十六禁止中的 字母 大写
注意:
1.一个占位符,只能匹配一个参数
2.占位符匹配,是按顺序一次匹配的。
普通字符 //原样输出
scanf //格式化输入函数