【C语言拓展】运算符、scanf与scanf_s的区别、特点

简介: 【C语言拓展】运算符、scanf与scanf_s的区别、特点

前言

本节课讲的是拓展提升:运算符,为什么vs高版本不能使用scanf,scanf_s与scanf的区别与优缺点

strcpy与strcpy_s的区别与优缺点


提示:以下是本篇文章正文内容,下面案例可供参考

一、运算符

运算符

运算符优先级与结合性的本意是先后结合哪个子表达式,相当于先分组,分组完 毕后,从左向右依次计算

int a = 1, b = 4, c = 8, d = 12, e = 99, f; 
f = a + b - c * d / e;

结合过程如下:

1、乘除优先级高,先结合,乘除同级从左到右结合即按优先级先结合乘法/除法,乘除结合性从左到右,所以先结合 c*d,然后/e

2、再结合加减,同级从左到右结合,即先结合 a+b,然后结合减法

3、最后结合赋值运算符


此表达式先算 a+b,而不是 c*d,所以优先级与结合性不是单纯的谁先算谁后算。我 们正常脑算看待优先级可以以先算后算来处理,不会影响结果

for循环最通用的写法

在for循环前写循环控制变量

//最通用的写法: 
int i ; //即循环控制变量的定义位置
for (i = 0; i < 5; i++) 
//在 vs2013 以上版本可以如下写:
for (int i = 0; i < 5; i++) 
 //但是该写法很多编译器都不支持,所以建议使用上边那种,以增加代码移植性

真短路或"||"

逻辑运算符:|| 读 或

运算规则:

真 || 真 为真 结果 1 真 || 假 为真 结果 1 假 || 真 为真 结果 1 假 || 假 为假 结果 0

真短路 || : 因为“真 || 表达式”结果一定是真,即“表达式”不管是什么都不改变结果,

所以“表达式”就不执行了,执行也是浪费时间,举例如下:

int a = 1, b = 1;
5 || (a=66) || (b=87);

过程:(依据优先级结合性执行即可)

5 为真,子表达式 5 || (a=2)中发生短路,所以(a=2)不执行,子表达式 5 || (a=2)结果 为真,即 1。 剩下 1 || (b=2),1 为真,短路||,所以(b=2)不执行,表达式 1 || (b=2)结果为真。 最终整个表达式结果为真,即 1,a、b 值保持 1 不变。

0 || (a=2) || (b=2);

过程:(依据优先级结合性执行即可)

短路原理的目的:增加程序执行效率

假短路与"&&"

逻辑运算符:&& 读 与

运算规则:

真 && 真 为真 结果 1 真 && 假 为假 结果 0 假 && 真 为假 结果 0 假 && 假 为假 结果 0

假短路&&:因为“假 && 表达式”结果一定是假,即“表达式”不管是什么都不改变结果

int a = 2, b = 2;
0 && (a=0) && (b=0);

过程:(依据优先级结合性执行即可)

0 为假,子表达式 0 && (a=0)发生短路,不执行(a=0),子表达式 0 && (a=0)为假, 即 0。剩下 0 && (b=0),0 为假,子表达式 0 && (b=0)发生短路,不执行(b=0),子表达 式 0 && (b=0)为假,即 0。 最终整个表达式结果为假,即 0,a、b 保持 2 不变

&&和||混合短路

与(&&)、或( || )混合短路:

执行原则:按照优先级与结合性分组,然后从左到右计算,遇到短路就短路,&&优

先级高于 ||

短路原理与代码优化

短路原理对代码优化的警示 真短路或: (条件 1) || (条件 2) 为真概率大的条件放左边,可以减少两个条件同时执行的概率,从而增加程序执行效率。

两个条件都判断执行的概率是 80% 假短路与:

(条件 1) & & (条件 2)

为假概率大的条件放左边,可以减少两个条件同时执行的概率,从而增加程序执行效率。

二、scanf与scanf_s

scanf_s是什么:scanf_s 与 scanf _s 版本的函数是 C11 标准的新函数,非_s 就是旧版 C 语言函数,新编译器建议大家使用新 版本的_s 函数

如何在vs高版本使用scanf

scanf 在高版本 vs 报错问题解决办法

1、声明宏 : #define _CRT_SECURE_NO_WARNINGS

2、关掉 sdl : 属性->c/c+±>常规->sdl 检查

3、scanf_s

scanf_s比scanf安全?

scanf_s 比 scanf 安全? 主要体现在越界问题中的处理措施 scanf 是在程序结束后报异常中断,不会立即中断

缺点 1,假设数万行代码,有数百个 scanf 输入,这时很难短时间内定位到越界点。

缺点 2,越界操作可能会侵害其他变量的空间,导致未知的莫名其妙的错误。

缺点3,程序不结束,其问题可能会像蝴蝶效应,影响越来越离谱。

scanf_s 会执行失败,变量输入不成功,函数返回值为 0

优点 1,可能及时知道错误点,并及时做出相应处理

优点 2,不会导致越界问题,所以不会侵害其他变量空间

三、strcpy与strcpy_s

参数的区别:

//参数使用区别 
strcpy_s(str, 20, "hello "); //参数 2 表示参数 1 的字节数 
strcpy(str, "hello w");

为啥要使用strcpy_s?

strcpy_s 比 strcpy 安全? 主要体现在越界问题中的处理措施 strcpy 是在程序结束后报异常中断,不会立即中断,跟 scanf 越界情况 1 样

缺点 1,假设数万行代码,有数百个 strcpy 使用,这时很难短时间内定位到越界点。

缺点 2,越界操作可能会侵害其他变量的空间,导致未知的莫名其妙的错误。

缺点3,程序不结束,其问题可能会像蝴蝶效应,影响越来越离谱。

strcpy_s 会立即中断,即函数调用位置中断,跟 scanf_s 处理方式不同

优点 1,立即知道错误点,并及时做出相应处理

优点 2,不会导致越界问题,因为直接停下了,不会往下运行了,所以不会侵害其他变

量空间


相关文章
|
28天前
|
C语言
C语言中的条件运算符和条件表达式详解
C语言中的条件运算符和条件表达式详解
41 0
|
20天前
|
C语言
C语言学习记录——枚举(定义、与结构体的区别、优点)
C语言学习记录——枚举(定义、与结构体的区别、优点)
18 3
|
23天前
|
C语言
C 语言关于sizeof() 和 strlen()区别?
C 语言关于sizeof() 和 strlen()区别?
13 2
|
1天前
|
存储 缓存 移动开发
【C语言基础篇】scanf()函数详解
【C语言基础篇】scanf()函数详解
|
2天前
|
存储 Linux 编译器
c语言的数据类型与运算符
c语言基础学习数据类型与运算符
|
28天前
|
存储 安全 C语言
C语言中的共用体与结构体的区别
C语言中的共用体与结构体的区别
35 3
|
5天前
|
C语言
C语言--指针数组和数组指针的区别
C语言--指针数组和数组指针的区别
|
28天前
|
IDE 测试技术 开发工具
|
21天前
|
C语言
C语言算数运算符和算数表达式详解
C语言算数运算符和算数表达式详解
16 0
|
21天前
|
存储 C语言
C语言数组指针和指针数组的区别及使用方法
C语言数组指针和指针数组的区别及使用方法
17 0