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

举报
人才程序员 发表于 2023/11/30 17:54:26 2023/11/30
【摘要】 @TOC 前言本节课讲的是拓展提升:运算符,为什么vs高版本不能使用scanf,scanf_s与scanf的区别与优缺点strcpy与strcpy_s的区别与优缺点提示:以下是本篇文章正文内容,下面案例可供参考 一、运算符 运算符运算符优先级与结合性的本意是先后结合哪个子表达式,相当于先分组,分组完 毕后,从左向右依次计算int a = 1, b = 4, c = 8, d = 12, e ...

@TOC


前言

本节课讲的是拓展提升:运算符,为什么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,不会导致越界问题,因为直接停下了,不会往下运行了,所以不会侵害其他变
量空间

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。