C/C++

  • Linux下如何编译多个c/c++和h文件

    最近在写一个要求兼容Linux 和 windows 的socket program,无奈对Linux 太不熟悉,不懂编译,搜得一大神的文章.在此分享.详细请见链接: http://www.chinaunix.net/old_jh/23/408225.html 下面是makefile的示例代码: edit : main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o cc -o edit main.o kbd.o co

    linux, C/C++, 编译February 26

  • mab送加密机Hsm前的异或

    对POS终端64域进行全报文加密时,需要获得从消息类型到63域之间的所有的报文信息当做Mab,然后送给加密机产生16位的Mac,最后取得前面8位作为Mac. 一开始,我们是取报文的特定域当做是Mab的值,这样可以减少和加密机交互时报文的字节大小:后来为了更安全的性能考虑,直接用全报文加密得到对应的Mab,即:我直接把消息类型到63域之间的值当做是Mab,然后送到加密机. 全报文的算mab就给加密机带来了一定的性能影响,比较报文长了,发送和接受加密机的时间也进而产生了.为了减轻加密机的吞吐负载,提

    Java, C/C++, 金额, 8583报文January 24

  • C/C++ 基础语法注意事项 (三)

    健壮性指的是软件在异常环境下仍然能够正常运行的能力,健壮性是非常重要的软件质量属性.提高C++应用软件健壮性的基本手段之一就是使用异常处理技术. C++保证:如果一个异常在抛出点没有得到处理,那么它将一直被抛向上层调用者,直至main()函数,直到找到一个类型匹配的异常处理器,否则调用terminate()结束程序.异常处理机制实际上是一种运行时通知机制. 任何一种类型都可以当作异常类型,因此任何一个对象都可以当作异常对象.包括基本数据类型的变量,常量,任何类型的指针,引用,结构等,真值空结构或

    stl, C/C++, 异常处理, 高质量编程January 17

  • C语言位域的使用及其注意点

    所谓"位域"是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数.每个域有一个域名,允许在程序中按域名进行操作. 这样就可以把几个不同的对象用一个字节的二进制位域来表示. 位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为: struct 位域结构名 { 位域列表 }; eg:struct weiyu { int a:2; int b:5; int :5;//此五位为空域,不能使用 int c:3; } 位域虽然简单好用,但使用时需要注意: 1) 如果相邻位域字段

    C/C++, BIT, fieldMay 22

  • C/C++ 结构体内存对齐

    本文的目的: 1. 介绍内存对齐的概念及为什么会有内存对齐的问题 2. 说明结构体内存对齐的规则 3. 通过几个实例说明规则 什么是结构体内存对齐? 我们知道字节是内存的单位,每一个字节在内存中都有唯一的地址,如0x0018FF0C.许多系统对变量在内存中存放的位置有要求,它们会要求结构体对象和结构体对象的成员所存放的地址是某个数的倍数(注意:对结构体和它们的各个变量的倍数的值根据类型不同而不同),这个倍数即对齐模数(alignment modulus).这就是结构体内存对齐的概念. 为什么结构

    C/C++, 结构体, 内存对齐March 31

  • 数据结构之二叉树
    数据结构之二叉树

    基本概念 树状图是一种数据结构,是由n个有限的节点组成的具有层次关系的集合. 二叉树: 每个节点最多含有两个子树的树. 二叉树结构的基本实现 // The tree struct store left child and right child struct node { char info; struct node *l, *r; }; typedef struct node *pTree; 每一个树的基本单元都有自己所代表的"值", 左孩子和右孩子, 将这个基本单元顺序的链结到一块

    C/C++, 数据结构, 二叉树February 26

  • C/C++中的static和extern关键字

    一.C语言中的static关键字 在C语言中,static可以用来修饰局部变量,全局变量以及函数.在不同的情况下static的作用不尽相同. (1)修饰局部变量 一般情况下,对于局部变量是存放在栈区的,并且局部变量的生命周期在该语句块执行结束时便结束了.但是如果用static进行修饰的话,该变量便存放在静态数据区,其生命周期一直持续到整个程序执行结束.但是在这里要注意的是,虽然用static对局部变量进行修饰过后,其生命周期以及存储空间发生了变化,但是其作用域并没有改变,其仍然是一个局部变量,作

    extern, C/C++, staticFebruary 13

  • extern常见问题锦集

    1 基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义. 另外,extern也可用来进行链接指定. 2 问题:extern 变量 在一个源文件里定义了一个数组:char a[6]; 在另外一个文件里用下列语句进行了声明:extern char *a: 请问,这样可以吗? 答案与分析: 1).不可以,程序运行时会告诉你非法访问.原因在于,指向类型T的指针并不等价于类型T的数组.extern char *a声明的是一

    extern, C/C++February 13

  • ODBC数据库连接的创建示例

    用于创建ODBC连接的示例代码 #include <string.h> #include <sqltypes.h> #include <sql.h> #include <sqlext.h> SQLHANDLE hEnv = SQL_NULL_HENV; SQLHANDLE hCon1 = SQL_NULL_HDBC; SQLHANDLE hCon2 = SQL_NULL_HDBC SQLRETURN iRet = 0; SQLCHAR szConnStr1[

    odbc, C/C++, 数据库连接January 13

  • C++相对于C的区别中的几点

    参加了两次学校的程序设计大赛,第一次都用的C,第二次用的C++.而第一次没有做出题目,第二次做出了4道. 对比之后,我便开始思考C++相对于C的不同之处. 1.C++可以动态分配内存 在C中,当我们需要输入一个数组,但是数组的长度不知道的情况下,我们会怎么做?通常我会选择一个可能出现最大的长度MAX,但是这完全不会考虑到特殊情况的:首先这个最大长度还不够大怎么办?第二如果实际输入的元素个数远远没有设置的那么多怎么办?内存不是有一个很大的空洞被浪费了? 而这一点在C++确实可以避免的,通常可以预先

    C/C++December 21

  • 字节存储排序:大端和小端的判别及转换

    当前的存储器,多以byte为访问的最小单元,当一个逻辑上的地址必须分割为物理上的若干单元时就存在了先放谁后放谁的问题,于是端(endian)的问题应运而生了,对于不同的存储方法,就有大端(big-endian)和小端(little- endian)两个描述. 字节排序按分为大端和小端,概念如下 大端(big endian):低地址存放高有效字节,即网络字节序. 小端(little endian):低字节存放低有效字节,即主机字节序. 现在主流的CPU,intel系列的是采用的little end

    C/C++, 大端, 小端, 字节序列October 10

  • [日积月累]C/C++可变参数函数的实现

    1.可变参函数的原理 C/C++函数的参数是存放在栈区的,并且参数的入栈是从参数的右边开始,即最后一个参数先入栈,而第一个参数最后才入栈,所以,根据栈的后进先出性质,函数总能找到第一个参数.所以,可变参函数的实现必须能够从已知参数中获取到函数所需要参数的个数; 例如printf函数,第一个参数就是一个格式串,而后面所需要的参数个数能够从格式串中得到. 2.可变参函数的设计 标准头文件stdarg.h提供了一套对可变参函数的实现机制,所以编写可变参函数需要包含该头文件.#include<stdar

    C/C++, 可变参数表, printf函数的实现September 28

  • 回调函数的问题

    编写C/C++ 程序时,才开始接触回调函数的使用可能回弄糊涂.本篇以C为例子,简要说一下回调函数的使用. C/C++中回调,有点类此C#中的事件等.一般在写库程序和主调程序时使用,为了在主调程序中获取库文件中的数据一般采用回调函数的方式.设计回调函数时,主要考虑两类参数,一则是库返还给用户的数据参数,另则是用户自己的数据.下面写个简单代码,说明.so文件包含file.c file.h文件,主程序main.c文件. file.h #ifndef FILE_H_ #define FILE_H_ ty

    C/C++, 回调函数August 14

  • Vim 中使用 OmniComplete 为 C/C++ 自动补全(部分增加)

    对原文做了部分修改及增加,原文地址http://timothyqiu.com/archives/using-omnicomplete-for-c-cplusplus-in-vim/ OmniComplete 并不是插件的名字,而是 Vim 众多补全方式中的一种(全能补全).说白了 OmniComplete 其实就是根据光标前的内容猜测光标后的内容,具体怎么猜取决于所采用的脚本. 而 OmniCppComplete 就是专为 C/C++ 编写的 OmniComplete 一个补全脚本. 那么经常和

    vim, fedora, C/C++, OmniCompleteAugust 10

  • goto语句引起的程序陷阱

    看下面代码,执行后会有什么隐患问题? int transfer_message_to_appserver(user_session_t *user_session,const char *uid,const char *message) { int ret = -1; xmlDocPtr doc = xmlParseMemory(message,strlen(message)); xmlNodePtr node = xmlDocGetRootElement(doc); if (NULL == u

    goto, C/C++, do whileJune 5

  • Notepad++配置C/C++IDE(详细)

    一.先前准备 1.notepad++ 2.配置一个C/C++的IDE必备的是GNU的GCC(用于编译)和GDB(用于调试).在Windows下,我们可以下载安装MinGW,这里默认就提供了GCC和GDB 二.参数配置 1.将MinGW下的bin目录放置在path目录下,让用户在cmd命令模式中可以直接调用g++/gcc和gdb命令. 具体如下: 计算机->属性->高级系统设置->环境变量->系统变量(用户变量也行):path 中添加D:\MinGW\bin;(作者是安装在D盘下)

    notepad, C/C++, IDEApril 23

  • C/C++ 实现可变参数

    引言 C语言支持可变参数,即参数个数不固定,典型的函数如printf, scanf等可以接受数量不定的参数. 如,printf("one parameter");printf("two parameter: %d", a);printf("three parameter: %d, %s", a, s); 上面三个printf分别接收1,2,3个参数.来看一下printf的原型: #include <stdio.h> int print

    C/C++, 可变参数, va_start, va_arg, va_endMarch 11

  • 女神拒绝他可以不用分号
    女神拒绝他可以不用分号

    "女神拒绝他,只用了一个分号"可谓家喻户晓,其实女神不用分号也可以拒绝他,充分映射出程序猿同胞的悲哀. int i; for(i = 0; i < forever; i++) printf("I Love You"); 广为认知的分号: int i; for(i = 0; i < forever; i++); printf("I Love You"); 女神拒绝他,只用了一个感叹号! int i; for(i = 0; i <

    C/C++, 哈哈March 10

  • ubuntu12.10 64位下eclipse for c/c++为arm写程序
    ubuntu12.10 64位下eclipse for c/c++为arm写程序

    前提您装了arm-linux-gcc这套交叉编译器. 1.安装jdk.这个就不说了.下载与您的机器相对应的jdk 2.去这里下载eclipse for c/c++即可: http://www.eclipse.org/downloads/ 下载与您的机器相对应的eclipse 3.tar xvfz eclipse-..... 解压即可 4. ./eclipse启动 5.启动的界面 6.新建项目 7.为ARM环境配置 在项目名字上右键 找到 properties(属性),选择c/c++ Build

    eclipse, ubuntu, C/C++, for, ARMFebruary 1

  • c/c++奇技淫巧

    无论你是写代码,还是看代码,还是调代码,总会打印输出,如果有颜色输出,岂不是很炫很方便,这里介绍后台c/c++代码中的一招(python版本的看 http://my.codeweblog.com/sanpeterguo/blog/88100) 其实只要定义一些宏 #define BRIGHT(format) "33[1;29m" format "33[m" #define DARK(format) "33[1;30m" format "

    C/C++, 颜色打印, 调用printfJanuary 31

  • c语言-位域
    c语言-位域

    1.什么是位域: 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为"位域"或"位段".所谓"位域"是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数.每个域有一个域名,允许在程序中按域名进行操作. 这样就可以把几个不同的对象用一个字节的二进制位域来表示. 2.位域变量的定义

    C/C++, 位域December 16

  • c++如何对自定义结构体排序

    C++中,当 vector 中的数据类型为基本类型时,我们调用std::sort函数很容易实现 对vector中数据成员的升序或降序排序,然而当vector中的数据类型为自定义结构体类型或者类时,我们可以通过以下两种方法(仅以结构体为例): 重载要排序的结构体或类的<号或者>号,演示代码如下: #include<vector> #include<algorIThm> using namespace std; typedef struct ValuePerWeight /

    C/C++, 自定义结构体排序December 16

  • 编程珠玑:快速排序

    前言 编程珠玑一书对快速排序讲得较为透彻,最早的快排是单向的,慢慢演化成双向的,也就是目前的版本.从此书能看到这种演化的必要性.我想这是我最后一次看快排,原理搞懂了就不会忘了. 快速排序思想 1962年,由C.A.R.Hoare创造出来.该算法核心思想就一句话:"排序数组时,将数组分成两个小部分,然后对它们递归排序".然而采取什么样的策略将数组分成两个部分是关键,想想看,如果随便将数组A分成A1和A2两个小部分,即便分别将A1和A2排好序,那么A1和A2重新组合成A时仍然是无序的.所以

    C/C++, 面试题, 编程珠玑, 数据结构和算法December 8

  • 编程珠玑:求子数组最大和
    编程珠玑:求子数组最大和

    问题描述: 输入一个整型数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.当所有的输入都是负数时,总和最大的子数组是空数组,总和为0.例如输入数组包含下面10个元素: 那么该程序的输出为x[2...6]的总和,即187. 题外话: 有人说编程珠玑这本书是经典,我也认同,但有人也说这本书是让人费脑筋提前掉头发的书,我更认同,有句话我想说,书中很多地方的描述非常绕,绕到你很难理解,即便理解了也很难给人讲明白.该问题就是很好的一个例子

    C/C++, 算法, 数据结构, 面试题, 编程珠玑November 25

  • 编程珠玑:变位词集
    编程珠玑:变位词集

    问题描述 给定一本英语单词词典,请找出所有的变位词集.例如,因为"pots"."stop"."tops"相互之间都是由另一个词的各个字母改变序列而构成的,因此这些词相互之间就是变位词. 解决思路 将该程序组织成三段式的"管道"结构,其中一个程序的输出文件将是下一个程序的输入文件.第一个程序对单词进行签名,第二个程序对已签名的文件进行排序,而第三个程序则将同一个变位词类中的各个单词挤压到同一行中.下面是在具有六个单词的词典中进行

    C/C++, 算法, 数据结构, 面试题, 编程珠玑November 19

  • eclipse C/C++ 问题(launch failed,binary not found)

    经过网上搜索资料加上本人测试,以下方法可行: 1,先装好JAVA 2,装好Eclipse3.32+MinGW1 3,打开CDT包把plugins和features拷到Eclipse相应的目录里 4,把Eclipse的configuration目录下的org.eclipse.update删了 5,启动Eclipse,现在可以建立C/C++工程了 6,现在建立你的C/C++工程 7,编写好你的源代码 8,在Project的Properties新建一个Builder(Project→Propertie

    eclipse, launch, C/C++, 问题, failed, not, found, BinaryNovember 16

  • 编程珠玑:向量旋转(旋转交换)
    编程珠玑:向量旋转(旋转交换)

    问题描述 请将一个具有n个元素的一维向量向左旋转i个位置.例如,假设n=8,i=3,那么向量abcdefgh旋转之后得到向量defghabc.简单编码使用一个具有n个元素的中间向量分n步即可完成此作业.你可以仅使用几十字节的微小内存,花费与n成比例的时间来旋转该向量吗? 解决思路 方案一: 将向量x中的前i个元素复制到一个临时数组中,接着将余下的n-i个元素左移i个位置,然后再将前i个元素从临时数组中复制回x中的后面位置. 该方案使用了i个额外的位置,如i足够大,过于浪费空间. 方案二: 定义一

    C/C++, 面试题, 编程珠玑, 数据结构与算法, 向量旋转November 14

  • C语言中指针与数组之异同
    C语言中指针与数组之异同

    前段时间面试的时候有一个问题涉及到了数组与指针的区别,发现自己在潜意识中把数组名和指针等同起来了.而事实上数组与指针确实是不同的,被问及二者区别的时候,我就只能含糊地说数组含有长度信息云云. 于是自己认真研究,思考了这个问题.后来发现<C专家编程>中原来有一章就是<令人震惊的事实:数组和指针并不相同>. 为什么我们会混淆数组与指针呢?虽然它们是不一样的概念,但使用起来是在是太像了,我们通常用数组的方式去访问一个指针指向的区域,同样也可以用指针的方式来访问一个数组,如下所示: cha

    C/C++, 指针, 数组October 30

  • vim c/c++智能补全插件
    vim c/c++智能补全插件

    我很喜欢vim,而且一直用,不过对于c/c++只能补全一直都没有一个很好的解决方案,虽然有个插件(omnicomplete)功能比较强大,跟eclipse等IDE比起来还是很有差距的,特别是对于类的智能补全. 前些天网上找到一个功能甚是强大的插件(clang complete),可以很好的解决这个问题,个人认为完全可以取代omnicomplete.这个插件依赖于clang编译器,这个编译器安装很简单,一般流行的linux发行版本的软件仓库中都有,比如在debian或ubuntu中可以这样, su

    vim, clang, C/C++, auto, completeOctober 16

  • 分享一个调试技巧(C\C++)

    #2012/09/17 更新 在调试代码时,有时会遇到报错的的函数是没问题,而是调用它的函数传入的参数是异常的,而又没法通过代码准确定位到具体调用的位置的情况,特别是对一些基础函数,往往会出现这种情况,因为工程中调用它们的地方太多,而且有时会漏掉返回值检测.这里给出一个快速找出调用者是谁的方法. //filename: tt.h #include <stdio.h> int foo(int p); #define foo(_a) \ (printf("[%s:%d]call foo(

    C/C++September 15

  • C++ Template中防止使用不完整类型

    Chromium的源码中有这么一段代码,看到两行奇怪的代码(?处),对于使用C++模板的人来说应该是多加注意并学习的. //filename: scoped_ptr.h template <class C> class scoped_ptr { public: explicit scoped_ptr(C* p = NULL) : ptr_(p) { } ~scoped_ptr() { enum { type_must_be_complete = sizeof(C) }; //? delete

    chromium, C/C++, templateSeptember 13

  • 让android支持RTSP及live555分析

    #DATE 2012/05/09 #2012/08/27由cnblogs迁入 如何让Android支持C++异常机制 Android不支持C++异常机制,如果需要用到的话,则需要在编译的时候加入比较完整的C++库. Android支持的C++库可以在Android NDK中找到(解压后找到libsupc++.a放到代码环境中即可): http://www.crystax.net/en/android/ndk/7 编译时加上参数: -fexceptions -lstdc++ 还需要将libsupc

    android, rtsp, live555, C/C++August 27

  • for_each宏

    #DATE 2010/11/19 #2012/08/27由cnblogs迁入 之前在编码的时候遇到几次需要将这么几个值统一处理下,当时也没有想到什么好招,就每个量都写了相同的代码,一直觉得很土,加之使用python时的for...in...的美好感觉,便写了个for_each的宏. for_each宏能够很方便遍历一组零散的元素,而且在遍历完之后将不再需要的临时申请的空间释放掉. set_list_m每次添加一个元素,set_list_f则会一次将所需要遍历的元素全部加入. 因为懒set_lis

    linux, C/C++August 27

  • 分享一个蛋疼的俄罗斯方块小游戏
    分享一个蛋疼的俄罗斯方块小游戏

    #DATE 2010/07/28 #2012/08/27由cnblogs迁入 我在Ubuntu 10.04下测试过,可以正常运行.不过界面让人蛋疼. 代码用到了NCURSES库.编译的时候链一下ncurses库就可以了,如: cc -Wall -O2 -o c01 file.c -lncurses 界面: /*************************************** * * TETRIS * * author: dave * date : 2010/07/28 * *****

    linux, game, C/C++August 27

  • lua 作为c/c++ 配置文件示例

    看了网上前人的碎片, 也贴个自己手写调试过的小示例. 环境: Ubuntu, Eclipse, lua5.1, gcc-4.6 两个文件: hello.cpp, test.lua hello.cpp 读取 test.lua的配置内容: /* * hello.cpp * * Created on: Jul 16, 2012 * Author: honghe */ #include <iostream> #include <cstdio> #include <lua.hpp>

    lua, C/C++July 16

  • 字符串分割函数strtok
    字符串分割函数strtok

    前天晚上和 xiaofazhen 看程序, 突然间看到他的代码里有 strtok 这么一个函数, 网上查了一下, 居然是用来做字符串分割的; 原来 C 下还是有这函数的, 以前还一直抱怨 C 下没有字符串分割函数, 很不方便, 看来还是自己孤陋寡闻胃(如果是 C++ 的话, 参照 这里, 使用 copy+istringstream 来实现); 不多说, 既然看到了, 就要好好学习一下. 以下代码测试环境为: Windows7 + Visual Studio 2010 函数原型: char *st

    strtok, C/C++, strsepJune 19

  • [辅]linux 的 string.h,string.c 文件

    为了防止以后找不到这些代码, 特转载过来, 原文地址为 说明: (1). 这篇代码是为本博的另一篇文章<字符串分隔函数strtok>服务的,单看这篇代码是无意义的. (2). github 上 linux 2.6 的 string.c, 里面已经没有 strtok 函数了. (19行能看到 "Kissed strtok() goodbye") ------------------------------------------------------------------

    linux, C/C++, StringJune 19

  • 深入类的初始化和方法重载(一)

    类为什么要初始化,这要追溯到程序员经常不太注意的一个问题,就是忘记初始化变量,尤其是C程序员.常常会因为某个变量未被初始化而引发不可预知的错误. 当然,C语言中不涉及到类的概念,但是,在C++和Java中,引入了构造器这种概念来解决这个问题.构造器就是用来做初始化的工作的,如果程序员忘记在建类的时候加上构造器,则编译器会自动创建构造器.为了调用 方便,采用与类名相同的名称来定义默认构造器的名称.有了默认构造器,就保证了我们在调用方法之前,它已经被初始化了. 在实际的开发中,为了让程序员按自己的需

    Java, C/C++, 重载, 继承, 初始化May 26

  • 对malloc的返回值应该如何转型 - 少即是多 - 专注

    本文概括叙述了一篇老文的内容,并且总结对malloc返回值的3种转型方式,(相对于原文)更全面的总结其各自的应用范围. 1. 原文内容 2. 对malloc的3种转型方式 3. 各自的应用范围 以前有篇文章叫<C/C++ 误区 -- 强制转换 malloc() 的返回值>. 文章大致内容是: 1. malloc函数在<stdlib.h> 或者 <cstdlib>头文件中,而不是<malloc.h>. 2. 由于C语言最初没有void类型,所以是使用char*

    malloc, C/C++May 8

  • 合并字符串的可变参数版本 - 少即是多 - 专注

    场景: 实际开发过程中,我们经常需要根据N个元素,拼凑出最终的目的字符串,可能是最终的command, 也可能是绝对路径什么的. 常见做法: 1.利用sprintf函数 char buffer[MAX_LENTH]; sprintf(buffer, "format-string", va1,va2,va3,...); 2.利用std::string类 std::string tmp; tmp += va1; tmp += va2; tmp += va3; ...... 但是本人认为,上

    C/C++, StringMay 8

  • C/C++左值性精髓(三)左值转换----从函数到指针的转换

    将函数转换为指针的目的,与数组到指针的转换一样,都是为了将符号数值化,以利于表达式计算.该条款规定: A function designator is an expression that has function type. Except when it is the operand of thesizeofoperator or the unary&operator, a function designator with type ''function returningtype'' is

    C/C++, 左值May 7

  • C/C++左值性精髓(三)左值转换----从数组到指针的转换

    数组和指针这两种实体,是最令初学者感到痛苦和纠结的一对"冤家".对两者内涵及联系的不断挖掘的过程,就相当于一次思维风暴.只有彻底理解对象.类型派生方式.左值性和常量等几种低层语言设施,才能获得对数组和指针的完整认识.那么,数组与指针之间千丝万缕的联系究竟是什么原因产生的呢?根本原因就在于下面要谈到的从数组到指针的转换条款. C和C++的数组到指针转换条款涵义大体相同,但C90和C99有些差别.C90规定: Except when it is the operand of the siz

    C/C++, 左值May 7

  • C/C++左值性精髓(三)左值转换---- 从左值到右值的转换

    先看一个例子: int i = 10; 编译器在内存中开辟一段具有sizeof( int )个字节的空间,用整数10初始化,并将该空间命名为i,i属于左值.当把i放在下面的表达式中时: i + 1; 由于+双目运算符仅要求右值,i这个符号并不是它需要的,此时编译器就从i所代表的对象中取出整数10,交给+运算符进行运算.从i所代表的对象中取出整数10的过程就是一个从左值到右值的转换过程.在这一过程中,原本的左值i被右值10代替,但是,i本身的性质并无改变,i仍然是一个左值,有些人会误解为i已经成了

    C/C++, 左值May 7

  • C/C++左值性精髓(三)左值转换

    左值转换又称为从左值到右值的转换.左值转换的发生一般基于两个原因: 第一:某些运算符仅要求右值操作数,例如+.-双目运算符,如果给予它们一个左值操作数,这时候就需要把左值转换为右值: 第二:某些指示符,例如数组和函数,由于不属于标量类型,即所代表的实体本身不能被视为数值,这些指示符欲参与表达式计算,就必须将其数值化,数值化的结果不同于一般对象的值,而是实体地址. 因此,基于上述原因,左值转换分为三类,分别是从左值到右值的转换.从数组到指针的转换和从函数到指针的转换.C++基于函数重载解析的需要,

    C/C++, 左值May 7

  • C/C++左值性精髓(二)哪些表达式是左值,哪些是右值?----后缀表达式

    在表达式的左值性中,后缀表达式是比较复杂的一种情况.后缀表达式有很多种,这里讨论的是E1.E2和E1->E2形式的后缀表达式. 4.1 E1.E2形式的后缀表达式 若E2为静态数据成员或引用数据成员,无论E1的左值性如何,E1.E2的结果都是左值:若E2为非静态非引用数据成员,C和C++标准都规定如果E1为左值,则E1.E2也是左值:当E1为右值时,从原理上说,右值对象的一部分也应该是一个右值,因此在C中,无论E2的左值性如何,E1.E2皆为右值:那么C++中的结果又如何呢?按道理应该顺理成章也

    C/C++, 左值May 6

  • C/C++左值性精髓(二)哪些表达式是左值,哪些是右值?--- 函数调用表达式和强制转换

    对于函数调用表达式和强制转换表达式的结果,在C中都属于右值:C++由于增加了引用类型,结果为引用的函数调用表达式和强制转换表达式都属于左值,示例如下: int& fun1( int & r ){ return r; } int fun2( void ){ return 10; } int i = 20; fun2( ) = 30; //A cout << ( fun1( i ) = 30 ); //B ( int & )10 = 20; //C ( const int

    C/C++, 左值May 6

  • C/C++左值性精髓(二)哪些表达式是左值,哪些是右值?----右值表达式

    C对于右值的定义是表达式的值,C中所有完整表达式的结果都是右值.所谓完整表达式(full expression),指的是这样的表达式,它不是其它表达式或声明符的一部分.包括条件表达式和逗号表达式等等都不产生左值,而子表达式计算产生的中间结果或临时对象,很多人以为都是右值,但实际上,它们不一定是右值.例如: int a[ 5 ] = { 1, 2, 3, 4, 5 }; int *p = a; *p = 2; /* A */ a[ 1 ] = 3; /* B */ *p; /* C */ a[ 1

    C/C++, 左值May 6

  • C/C++左值性精髓(二)哪些表达式是左值,哪些是右值?-----左值表达式

    左值具有对象或不完整类型,在C++中还具有函数或引用类型,但是,并非具有上述类型的表达式就是左值,关键是左值必须指示一个对象,无论该对象有效或无效.完整或不完整,在C++中则包含非静态成员函数之外的函数.例如: int i; int *p = &i; i和p都指示一个对象,且具有对象类型,因而都是左值,而&i虽然具有对象类型,但由于没有指示一个对象,因此不是左值. 不完整类型也可以成为左值,因为不完整类型本质其实与对象类型一样,只不过尚未有完整的对象信息.前向声明是我们最常用的不完整类型,

    C/C++, 左值May 6

  • C/C++左值性精髓(一) 左值的前世今生

    左值(lvalue)是C/C++表达式的属性.只有针对一个表达式,才能谈论其左值性. 左值性由来已久,早在世界上第一个C标准C89出现之前就已经存在了.早期的定义是基于内置赋值运算符的需求的,能作为赋值运算符的左操作数的表达式属于左值,只能作为右操作数的表达式属于右值(rvalue),左值.右值中的左右两字来源于此. 但左值性的早期定义过于粗糙,导致它具有很大的局限性,有些现象甚至无法解释.例如数组名,数组属于聚集,不是标量类型,其内容无法作为一个数值表示,而赋值运算符要求操作数为标量类型(结构

    C/C++, 左值May 6

  • C/C++感悟一二

    经常看到有人问:学C++要不要学C,或者又有些人在争论哪个语言好.这边,我也有点感触,跟大家分享一下吧. 最近看到一句话,挺有感触,大意是:许多C++程序员把C++当成是一种信仰.它很好的表达了我对C++的感觉.因为我喜欢C++. 其实,一个程序员,因为兴趣喜欢某一门编程语言的时候,就是把他当成一种信仰的.觉得他是最好的.有种盲目的喜欢,盲目的觉得他好.当看到有人说他好时高兴,有人说他不好时不爽. 但是,不要疲于争论,而忘了,喜欢一种语言最好的表达方式就是用它来编程,不断的编程. 许多人经常会把

    C/C++, 区别March 22