C/C++ 中的算术及其陷阱】的更多相关文章

目录 概述 C/C++ 整数的阴暗角落 整型字面量 整型提升与寻常算术转换 算术溢出检测 位运算技巧 总结 参考 概述 无符号数和有符号数是通用的计算机概念,具体到编程语言上则各有各的不同,程序员是解决实际问题的,所以必须熟悉编程语言中的整数.C/C++ 有自己特殊的算术运算规则,如整型提升和寻常算术转换,并且存在大量未定义行为,一不小心就会产生 bug,解决这些 bug 的最好方法就是熟悉整数性质以避免 bug. 我不是语言律师(非贬义),对 C/C++ 算术特性的了解主要来自教材和互联网,但…
浅析C/C++中的switch/case陷阱 先看下面一段代码: 文件main.cpp #include<iostream> using namespace std; int main(int argc, char *argv[]) { ; switch(a) { : ;cout<<b<<endl;break; : cout<<b<<endl;break; default:break; } ; } 在gcc编译器下编译的结果为: 提示跳过了变量b…
Shell 脚本变量默认是作为字符串处理,而不是数字,这使得在 Shell 脚本做数学运算显得较为复杂.在保持脚本编程规范和更好的算术支持方便,Perl 和 Python 会是更好的选择.但是你仍然可以选择在 Shell 中进行算术.事实上,过去许多年来,Unix 已经增加多种特性来支持数字处理. 备注:正如下文所示,一些帮助处理数字的命令在某些方便表现仍不够完善,例如运算符周围的空格. declare 在 Shell 中你无需提前声明变量,但如果你提前声明一个整型变量,那么以下示例将展示整型变…
软件测试 中 LoadRunner 函数中的几个陷阱 1.atof 在 loadrunner 中如果直接用 float f; f=atof("123.00"); lr _output_message("%f",f); 输出的结果会是1244128.00,根本不是我们想要的. 因为float,double型在不同的平台下长度不一样,所以在loadrunner 软件测试中LoadRunner函数中的几个陷阱 1.atof 在loadrunner中如果直接用 float…
一.算术运算符 算术运算符主要用于进行基本的算术运算,如加法.减法.乘法.除法等. Java 中常用的算术运算符: 其中,++ 和 -- 既可以出现在操作数的左边,也可以出现在右边,但结果是不同滴 例1: 运行结果: 例2: 运行结果: 一定要注意哦!自增和自减运算符只能用于操作变量,不能直接用于操作数值或常量!例如 5++ . 8-- 等写法都是错误滴! PS:% 用来求余数,也称为"取模运算符" 例子: public class HelloWorld{    public stat…
1,当心ISNULL函数对你的逻辑引起BUG 有人喜欢或者习惯于(并不代表我推荐,甚至这种写法没有任何好处)用ISNULL处理变量这种方式写查询 比如:select * from TestISNULL where name = ISNULL(@name,name) @name相当于传入到存储过程中的参数,如果@name为null, 相当于:select * from TestISNULL where name = name,看起来恒成立,是真的吗? 目的是在@name为null的时候,这个查询条…
每天写代码,偶尔就会有让你抓狂的时候:代码改了千百遍,蓦然回首,Bug就在灯火阑珊处……这里就列举一些容易犯错的几个小地方,以后遇到了其他的,再慢慢添加.   1. 获取程序当前运行路径   情景复现:WPF客户端程序,开机自启动后无法进入主界面,卡在初始屏(Splash Screen)   处理问题:通过日志发现加载一个icon的时候,跳了一个Bug.初始代码如下: var icon = new Icon("Images\\xxx.ico"); 很简单,貌似不会有问题,相对目录且正确…
OI/ACM中经常要用到小数来解决问题(概率.计算几何等),但是小数在计算机中的存储方式是浮点数而不是我们在作数学运算中的数,有精度的限制. 以下以GUN C++为准,其他语言(或编译器)也差不了多少.本文竞赛向. 一.基础篇 1.一般浮点数使用double,范围为大概为-10^308 ~ 10^308,有效精度为15~16位10进制数. 2.一般没事(比如内存问题)不用float,而使用double,一个double占8个字节. 3.信息学竞赛一般使用scanf和printf输入输出,而浮点数…
来源:http://www.imooc.com/code/1279 算术运算符主要用于进行基本的算术运算,如加法.减法.乘法.除法等. Java 中常用的算术运算符: 其中,++ 和 -- 既可以出现在操作数的左边,也可以出现在右边,但结果是不同滴 运行结果: 运行结果: 一定要注意哦!自增和自减运算符只能用于操作变量,不能直接用于操作数值或常量!例如 5++ . 8-- 等写法都是错误滴! PS:% 用来求余数,也称为”取模运算符“ 任务 亲,算术运算符的使用你学会了吗?让我们来检验一下吧.…
译注:文本有所精简和意译 原文链接 : Java Parallel Streams Are Bad for Your Health!原作者:OLEG SHELAJEV 翻译:Hason 转载请保留相关信息 Java8 提供了三个我们渴望的重要的功能:Lambdas . Stream API.以及接口的默认方法.不过我们很容易滥用它们甚至破坏自己的代码. 今天我们来看看Stream api,尤其是 parallel streams.这篇文章概述了其中的陷阱. 但是首先让我们看看Stream api…
在写while循环的时候,发现了一个问题,在while循环内部对变量赋值.定义变量.数组定义等等环境,在循环外面失效. 一个简单的测试脚本如下: #!/bin/bash echo "abc xyz" | while read line do new_var=$line done echo new_var is null: $new_var? 执行结果证明,$new_var的结果是空值.在google上查了查,才发现问题出在管道上. 先看看下面的内容. while循环的写法有好几种,它的…
MySQL 支持的算术运算符包括加.减.乘.除和模运算.它们是最常使用.最简单的一类运算符.表4-1 列出了这些运算符及其作用. 下例中简单地描述了这几种运算符的使用方法: mysql> select 0.1+ 0.3333 ,0.1-0.3333, 0.1*0.3333, 1/2,1%2; +-------------+------------+------------+--------+------+ | 0.1+ 0.3333 | 0.1-0.3333 | 0.1*0.3333 | 1/2…
算术运算符主要用于进行基本的算术运算,如加法.减法.乘法.除法等. Java 中常用的算术运算符: 其中,++ 和 -- 既可以出现在操作数的左边,也可以出现在右边,但结果是不同滴 例1: 运行结果: a:6 b:6 例2: 运行结果: a:6 b:5 一定要注意哦!自增和自减运算符只能用于操作变量,不能直接用于操作数值或常量!例如 5++ . 8-- 等写法都是错误滴! PS:% 用来求余数,也称为”取模运算符“…
(defun rmapcar (fn &rest args) (if (some #'atom args) (apply fn args) (apply #'mapcar #'(lambda (&rest args) (apply #'rmapcar fn args)) args))) 这段代码第一眼看上去,怎么都像无限递归,不断的用&rest对参数做list,然后用mapcar做car,但是这段代码又是确确实实能运行的.仔细分析以后,可以肯定哪个函数的调用对参数多做了一次类似ca…
typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending}; 其中,NSOrderedSame 表示比较的两个字符串完全一致, 同时,在这个枚举中,它的值是 0. 字符串比较在程序中很常见,比如: if ([str1 compare:@"some text"] == NSOrderedSame) { // Do somethin…
for...in循环中的循环计数器是字符串,而不是数字它包含当前属性的名称或当前数组元素的索引,下面有个不错的示例大家可以参考下   大家都知道在JavaScript中提供了两种方式迭代对象: (1)for 循环: (2)for..in循环: 使用for循环进行迭代数组对象,想必大家都已经司空见惯了.但是,使用for.. in循环时,大家可要注意了,为什么这么说呢?大家听我娓娓道来.... javascript提供了一种特殊的循环(也就是for .. in循环),用来迭代对象的属性或数组的每个元…
旧事重提了,或许很多人会奇怪,为什么 C# 不允许lock一个struct ? 例如: public void ProcessTask(int taskid){     lock(taskid){  .....   } } 编译说lock只能使用引用类型.有些人聪明(我想我以前也有这样的"聪明"..),这样做: lock((object)taskid){...} 但是,实际的经验告诉我,这样行不通,lock需要的是引用,严格来说是需要对象的实例. 即使对象在意义上是相同的,但是如果不是…
下面我总结了集合.泛型.数组转集合等一些常见的陷进,认真看完,相信你绝对有所收获. 1.List ,List<?> 与 List<Object> 有区别吗? 说实话,我敢保证很多人是不知道 List, List<?> 与 List<Object> 之间的区别的. 1.我们先来看看 List 与 List<Object> 很多可能觉得 List<Object>的用法与 List 是一样的,例如很多人认为 List<Object&g…
ArrayList 中 subList 的基本用法: subList(fromIndex:int,toIndex:int):List<E> 返回从fromIndex到toindex-1 的 子列表 在使用集合中,可能常常需要取集合中的某一部分子集来进行一下操作,于是subList这个方法就映入我们的眼帘,毫不犹豫地使用. 例如以下代码: public static void main(final String[] args) { List<Object> lists = new A…
算术运算符 //$a=10; $b=5; //取反: //echo -$a;//输出:-10: //加法: //echo $a+$b;//输出:15 //减法: //echo $a-$b;//输出:5 //乘法: //echo $a*$b;//输出:50 //除法: //echo $a/$b; //递增/递减运算符 //++在前 //$b=++$a; //echo $b;//输出++后的值:6 //++在后 //$c=$a++; //echo $c;//输出++前的值:5 //--在前 //$d…
1. 背景 近日在一个Hadoop项目中使用MultipleInputs增加多输入文件时,发现相同路径仅会加载一次,导致后续的统计任务严重失真.本博文旨在记录异常的排查及解决方案. 2. 情景重现 (1) 准备简版的输入文件test,文件内容为"i am ws",输入的HDFS路径为/work/justTest/test (2) 源码信息如下,主要是wordCount实现,其中/work/justTest/test作为输入路径,被输入两次: package com.ws.test; i…
JavaScript中有很多遍历数组的方式,比较常见的是for(var i=0;i<arr.length;i++){},以及for...in...循环等,这些遍历都有各自的优缺点,下面来看看各种JS的遍历对比: 1.for...in... 1).index索引为字符串型数字,不能直接进行几何运算. 2).遍历顺序有可能不是按照实际数组的内部顺序. 3).使用for in会遍历数组所有的可枚举属性,包括原型.例如上栗的原型方法method和name属性. Array.prototype.myfun…
谨记红字: 1. 表中谨防太多列: MySQL 的存储引擎API 工作时需要在服务器层和存储引擎层之间通过行缓冲格式拷贝数据,然后在服务器层将缓冲内容解码成各个列.从行缓冲中将编码过的列转换成行数据结构的操作代价是非常高的.MyISAM 的定长行结构实际上与服务器层的行结构正好匹配,所以不需要转换.然而,MyISAM 的变长行结构和InnoDB 的行结构则总是需要转换.转换的代价依赖于列的数量.当我们研究一个CPU 占用非常高的案例时,发现客户使用了非常宽的表(数千个字段),然而只有一小部分列会…
//闭包解决 循环输出的问题 for(var i=0;i<rows.length;i++) {( function (i) { })(i);…
对于这类问题而言,难度不大,多半是由于我们有误操作引起的.但在查找问题所在的时候我们有可能需要花费一番功夫了. 实例一: package com.yonyou.test; /** * 测试类 * @author 小浩 * @创建日期 2015-3-2 */ public class Test { public static void main(String[] args) { if(0>9); System.out.println("0大于9"); } } 咋一看竟然输出了 &q…
Java进阶4表达式中的陷阱 20131103 表达式是Java中最基本的组成单元,各种表达式是Java程序员最司空见惯的内容,Java中的表达式并不是十分的复杂,但是也有一些陷阱.例如当程序中使用算术表达式的时候,表达式的类型自动提升,复合赋值运算符所隐含的类型转换,给程序带来一些潜在的陷阱.还有就是JDK1.5之后支持泛型也会带来一些陷阱,因为之前的Java版本是不支持泛型的,为了兼容之前的版本,引入了原始类型的概念,而原始类型在泛型编程中存在着极大的陷阱. 1.字符串中的陷阱 JVM对于字…
List,List<Object>区别 List<Integer> t1 = new ArrayList<>(); // 编译通过 List t2 = t1; //编译失败 List<Object> t3 = t1; t1 可以赋给 t2, 但是 t1 不能赋给 t3,会抛出如下异常 Error:(16, 35) java: 不兼容的类型: java.util.List<java.lang.Integer>无法转换为java.util.List&…
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 陷阱1 理解函数声明 作者提出一个问题:有一个首地址为0的函数,该函数返回值类型为void,没有参数.怎样用C语言的语句调用这个函数? 答案是(*(void  (*)())0)(); 要理解这个调用形式,要清楚如下两个问题: 一是函数指针. 假设fp是一个函数指针,则调用fp所指向的函数的方法是 (*fp)(); 因为fp是一个函数指针,所以*fp是该指针所指向的函数,所以(*fp)()就是调用该函数的方式.AN…
第3章 语义"陷阱"     一个句子哪怕其中的每个单词都拼写正确,而且语法也无懈可击,仍然可能有歧义或者并非书写者希望表达的意思.程序也有可能表面上是一个意思,而实际上的意思却相去甚远,本章考查了若干种可能引起上述歧义的程序书写方式. 3.1 指针与数组     C语言中指针与数组这两个概念之间的联系是如此密不可分,以至于如果不能理解其中一个概念,就不可能理解另一个概念.而且,C语言对这些概念的处理, 在某些方面与其它任何为人熟知的程序语言都不同.   C语言的数组值得注意的地方有以…
第2章 语法陷阱 2.1 理解函数声明   当计算机启动时,硬件将调用首地址为0位置的子例程,为了模拟开机时的情形,必须设计出一个C语言,以显示调用该子例程,经过一段时间的思考,得出语句如下: ( *(void(*) () )0 ) ();   像这样的表达式看起来很难理解,但只要将其一层一层地剥离,还是能够理解的.下面我将用几个例子来帮助大家逐渐理解这个表达式. void *a(); void (*b) ();   因为()的优先级高于,所以a()为(a()),a是一个函数,该函数的返回类型为…