c++ 便携通讯录,要求如下,感谢大佬的话

红字勾的四道题目,要用C++语言编程,感谢大佬帮忙了🙏🙏&#128_百度知道
红字勾的四道题目,要用C++语言编程,感谢大佬帮忙了🙏🙏&#128
红字勾的四道题目,要用C++语言编程,感谢大佬帮忙了🙏🙏🙏...
红字勾的四道题目,要用C++语言编程,感谢大佬帮忙了🙏🙏🙏
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
你的回答被采纳后将获得:
系统奖励15(财富值+成长值)+难题奖励20(财富值+成长值)
来自电脑网络类芝麻团
你至少写点东西出来让大家帮忙改,不懂的地方问啊。直接当伸手党,我就是你die都不会帮你。
🙄不是啦,我不懂这个,帮别人问的
能不能帮我写一下啊,我发红包的
😞😞😞
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。一、Lua堆栈
要理解Lua和C++交互,首先要理解Lua堆栈。
简单来说,Lua和C/C++语言通信的主要方法是一个无处不在的虚拟栈。栈的特点是先进后出。
在Lua中,Lua堆栈就是一个struct,堆栈索引的方式可是是正数也可以是负数,区别是:正数索引1永远表示栈底,负数索引-1永远表示栈顶。如图:
lua的栈类似于以下的定义, 它是在创建lua_State的时候创建的:
TValue stack[max_stack_len]
// 欲知内情可以查 lstate.c 的stack_init函数
存入栈的数据类型包括数值, 字符串, 指针, talbe, 闭包等, 下面是一个栈的例子:
执行下面的代码就可以让你的lua栈上呈现图中的情况
lua_pushcclosure(L, func, 0) // 创建并压入一个闭包
lua_createtable(L, 0, 0)
// 新建并压入一个表
lua_pushnumber(L, 343)
// 压入一个数字
lua_pushstring(L, “mystr”)
// 压入一个字符串
这里要说明的是, 你压入的类型有数值, 字符串, 表和闭包[在c中看来是不同类型的值], 但是最后都是统一用TValue这种数据结构来保存的:), 下面用图简单的说明一下这种数据结构:
TValue结构对应于lua中的所有数据类型, 是一个{值, 类型} 结构, 这就lua中动态类型的实现, 它把值和类型绑在一起, 用tt记录value的类型, value是一个联合结构, 由Value定义, 可以看到这个联合有四个域, 先说明简单的
p -- 可以存一个指针, 实际上是lua中的light userdata结构
n -- 所有的数值存在这里, 不管是int , 还是float
b -- Boolean值存在这里, 注意, lua_pushinteger不是存在这里, 而是存在n中, b只存布尔
gc -- 其他诸如table, thread, closure, string需要内存管理垃圾回收的类型都存在这里
gc是一个指针, 它可以指向的类型由联合体GCObject定义, 从图中可以看出, 有string, userdata, closure, table, proto, upvalue, thread
从下面的图可以的得出如下结论:
1. lua中, number, boolean, nil, light userdata四种类型的值是直接存在栈上元素里的, 和垃圾回收无关.
2. lua中, string, table, closure, userdata, thread存在栈上元素里的只是指针, 他们都会在生命周期结束后被垃圾回收.
二、堆栈的操作
因为Lua与C/C++是通过栈来通信,Lua提供了C API对栈进行操作。
我们先来看一个最简单的例子:
#include &iostream&
#include &string.h&
extern "C"
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
void main()
//1.创建一个state
lua_State *L = luaL_newstate();
//2.入栈操作
lua_pushstring(L, "I am so cool~");
lua_pushnumber(L,20);
//3.取值操作
if( lua_isstring(L,1)){
//判断是否可以转为string
cout&&lua_tostring(L,1)&&
//转为string并返回
if( lua_isnumber(L,2)){
cout&&lua_tonumber(L,2)&&
//4.关闭state
lua_close(L);
可以简单理解为luaL_newstate返回一个指向堆栈的指针,其它看注释应该能懂了吧。
其他一些栈操作:
lua_gettop (lua_State *L);
//返回栈顶索引(即栈长度)
lua_settop (lua_State *L, int idx);
lua_pushvalue (lua_State *L, int idx);//将idx索引上的值的副本压入栈顶
lua_remove (lua_State *L, int idx);
//移除idx索引上的值
lua_insert (lua_State *L, int idx);
//弹出栈顶元素,并插入索引idx位置
lua_replace (lua_State *L, int idx);
//弹出栈顶元素,并替换索引idx位置的值
lua_settop将栈顶设置为一个指定的位置,即修改栈中元素的数量。如果值比原栈顶高,则高的部分nil补足,如果值比原栈低,则原栈高出的部分舍弃。所以可以用lua_settop(0)来清空栈。
三、C++调用Lua
我们经常可以使用Lua文件来作配置文件。类似ini,xml等文件配置信息。现在我们来使用C++来读取Lua文件中的变量,table,函数。
lua和c通信时有这样的约定: 所有的lua中的值由lua来管理, c++中产生的值lua不知道, 类似表达了这样一种意思: "如果你(c/c++)想要什么, 你告诉我(lua), 我来产生, 然后放到栈上, 你只能通过api来操作这个值, 我只管我的世界", 这个很重要, 因为:
"如果你想要什么, 你告诉我, 我来产生"就可以保证, 凡是lua中的变量, lua要负责这些变量的生命周期和垃圾回收, 所以, 必须由lua来创建这些值(在创建时就加入了生命周期管理要用到的簿记信息)
"然后放到栈上, 你只能通过api来操作这个值", lua api给c提供了一套完备的操作界面, 这个就相当于约定的通信协议, 如果lua客户使用这个操作界面, 那么lua本身不会出现任何"意料之外"的错误.
"我只管我的世界"这句话体现了lua和c/c++作为两个不同系统的分界, c/c++中的值, lua是不知道的, lua只负责它的世界
现在有这样一个hello.lua 文件:
str = "I am so cool"
tbl = {name = "shun", id = }
function add(a,b)
return a + b
我们写一个test.cpp来读取它:
#include &iostream&
#include &string.h&
extern "C"
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
void main()
//1.创建Lua状态
lua_State *L = luaL_newstate();
if (L == NULL)
//2.加载Lua文件
int bRet = luaL_loadfile(L,"hello.lua");
cout&&"load file error"&&
//3.运行Lua文件
bRet = lua_pcall(L,0,0,0);
cout&&"pcall error"&&
//4.读取变量
lua_getglobal(L,"str");
string str = lua_tostring(L,-1);
cout&&"str = "&&str.c_str()&&
//str = I am so cool~
//5.读取table
lua_getglobal(L,"tbl");
lua_getfield(L,-1,"name");
str = lua_tostring(L,-1);
cout&&"tbl:name = "&&str.c_str()&& //tbl:name = shun
//6.读取函数
lua_getglobal(L, "add");
// 获取函数,压入栈中
lua_pushnumber(L, 10);
// 压入第一个参数
lua_pushnumber(L, 20);
// 压入第二个参数
int iRet= lua_pcall(L, 2, 1, 0);// 调用函数,调用完成以后,会将返回值压入栈中,2表示参数个数,1表示返回结果个数。
// 调用出错
const char *pErrorMsg = lua_tostring(L, -1);
cout && pErrorMsg &&
lua_close(L);
if (lua_isnumber(L, -1))
//取值输出
double fValue = lua_tonumber(L, -1);
cout && "Result is " && fValue &&
//至此,栈中的情况是:
//=================== 栈顶 ===================
I am so cool~
//=================== 栈底 ===================
//7.关闭state
lua_close(L);
知道怎么读取后,我们来看下如何修改上面代码中table的值:
// 将需要设置的值设置到栈中
lua_pushstring(L, "我是一个大帅锅~");
// 将这个值设置到table中(此时tbl在栈的位置为2)
lua_setfield(L, 2, "name");
我们还可以新建一个table:
// 创建一个新的table,并压入栈
lua_newtable(L);
// 往table中设置值
lua_pushstring(L, "Give me a girl friend !"); //将值压入栈
lua_setfield(L, -2, "str"); //将值设置到table中,并将Give me a girl friend 出栈
需要注意的是:堆栈操作是基于栈顶的,就是说它只会去操作栈顶的值。
举个比较简单的例子,函数调用流程是先将函数入栈,参数入栈,然后用lua_pcall调用函数,此时栈顶为参数,栈底为函数,所以栈过程大致会是:参数出栈-&保存参数-&参数出栈-&保存参数-&函数出栈-&调用函数-&返回结果入栈。
类似的还有lua_setfield,设置一个表的值,肯定要先将值出栈,保存,再去找表的位置。
再不理解可看如下例子:
lua_getglobal(L, "add");
// 获取函数,压入栈中
lua_pushnumber(L, 10);
// 压入第一个参数
lua_pushnumber(L, 20);
// 压入第二个参数
int iRet= lua_pcall(L, 2, 1, 0);// 将2个参数出栈,函数出栈,压入函数返回结果
lua_pushstring(L, "我是一个大帅锅~");
lua_setfield(L, 2, "name");
// 会将"我是一个大帅锅~"出栈
另外补充一下:
lua_getglobal(L,"var")会执行两步操作:1.将var放入栈中,2.由Lua去寻找变量var的值,并将变量var的值返回栈顶(替换var)。
lua_getfield(L,-1,"name")的作用等价于 lua_pushstring(L,"name") + lua_gettable(L,-2)
lua value 和 c value的对应关系
{value=0, tt = t_nil}
{value=非0/0, tt = t_boolean}
int/float等
{value=1.5, tt = t_number}
lightuserdata
void*, int*, 各种*
{value=point, tt = t_lightuserdata}
{value=gco, tt = t_string}
gco=TString obj
{value=gco, tt = t_table}
gco=Table obj
{value=gco, tt = t_udata} gco=Udata obj
{value=gco, tt = t_function} gco=Closure obj
可以看出来, lua中提供的一些类型和c中是对应的, 也提供一些c中没有的类型. 其中有一些药特别的说明一下:
nil值, c中没有对应, 但是可以通过lua_pushnil向lua中压入一个nil值
注意: lua_push*族函数都有"创建一个类型的值并压入"的语义, 因为lua中所有的变量都是lua中创建并保存的, 对于那些和c中有对应关系的lua类型, lua会通过api传来的附加参数, 创建出对应类型的lua变量放在栈顶, 对于c中没有对应类型的lua类型, lua直接创建出对应变量放在栈顶.
lua_pushstring(L, “string”) lua根据"string"创建一个 TString obj, 绑定到新分配的栈顶元素上
lua_pushcclosure(L,func, 0) lua根据func创建一个 Closure obj, 绑定到新分配的栈顶元素上
lua_pushnumber(L,5) lua直接修改新分配的栈顶元素, 将5赋值到对应的域
lua_createtable(L,0, 0)lua创建一个Tabke obj, 绑定到新分配的栈顶元素上
总之, 这是一个 c value –& lua value的流向, 不管是想把一个简单的5放入lua的世界, 还是创建一个table, 都会导致
1. 栈顶新分配元素
2. 绑定或赋值
还是为了重复一句话, 一个c value入栈就是进入了lua的世界, lua会生成一个对应的结构并管理起来, 从此就不再依赖这个c value
lua value –& c value时, 是通过 lua_to* 族api实现, 很简单, 取出对应的c中的域的值就行了, 只能转化那些c中有对应值的lua value, 比如table就不能to c value, 所以api中夜没有提供 lua_totable这样的接口.
四、Lua调用C++
我们分三个方法实现它。
方法一:直接将模块写入Lua源码中
在Lua中调用C/C++,我们可以将函数写lua.c中,然后重新编译Lua文件。
编译好后是这样子的:(如图)
然后我们可以在lua.c中加入我们自己的函数。函数要遵循规范(可在lua.h中查看)如下:
typedef int (*lua_CFunction) (lua_State *L);
换句话说,所有的函数必须接收一个lua_State作为参数,同时返回一个整数值。因为这个函数使用Lua栈作为参数,所以它可以从栈里面读取任意数量和任意类型的参数。而这个函数的返回值则表示函数返回时有多少返回值被压入Lua栈。(因为Lua的函数是可以返回多个值的)
然后我们在lua.c中加入如下函数:
// This is my function
static int getTwoVar(lua_State *L)
// 向函数栈中压入2个值
lua_pushnumber(L, 10);
lua_pushstring(L,"hello");
在pmain函数中,luaL_openlibs函数后加入以下代码:
//注册函数
lua_pushcfunction(L, getTwoVar); //将函数放入栈中
lua_setglobal(L, "getTwoVar");
//设置lua全局变量getTwoVar
通过查找lua.h
/#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))
我们发现之前的注册函数可以这样子写:
lua_register(L,"getTwoVar",getTwoVar);
运行,结果如图:
当然,一般我们不建议去修改别人的代码,更倾向于自己编写独立的C/C++模块,供Lua调用,下面来讲讲如何实现。
方法二:使用静态依赖的方式
1. 新建一个空的win32控制台工程,记得在vc++目录中,把lua中的头文件和lib文件的目录包含进来,然后-&链接器-&附加依赖项-&将lua51.lib和lua5.1.lib也包含进来。
2. 在目录下新建一个avg.lua如下:
avg, sum = average(10, 20, 30, 40, 50)
print("The average is ", avg)
print("The sum is ", sum)
3.新建test.cpp如下:
#include &stdio.h&
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
/* 指向Lua解释器的指针 */
lua_State* L;
static int average(lua_State *L)
/* 得到参数个数 */
int n = lua_gettop(L);
double sum = 0;
/* 循环求参数之和 */
for (i = 1; i &= i++)
/* 求和 */
sum += lua_tonumber(L, i);
/* 压入平均值 */
lua_pushnumber(L, sum / n);
/* 压入和 */
lua_pushnumber(L, sum);
/* 返回返回值的个数 */
int main ( int argc, char *argv[] )
/* 初始化Lua */
L = lua_open();
/* 载入Lua基本库 */
luaL_openlibs(L);
/* 注册函数 */
lua_register(L, "average", average);
/* 运行脚本 */
luaL_dofile(L, "avg.lua");
/* 清除Lua */
lua_close(L);
/* 暂停 */
printf( "Press enter to exit…" );
getchar();
执行一下,我们可以得到结果:
大概顺序就是:我们在C++中写一个模块函数,将函数注册到Lua解释器中,然后由C++去执行我们的Lua文件,然后在Lua中调用刚刚注册的函数。
看上去很别扭啊有木有。接下来介绍一下dll调用方式。
方法三:使用dll动态链接的方式
我们先新建一个dll工程,工程名为mLualib。(因此最后导出的dll也为mLualib.dll)
然后编写我们的c++模块,以函数为例,我们先新建一个.h文件和.cpp文件。
h文件如下:(如果你不是很能明白头文件的内容,点击这里:http://blog.csdn.net/shun_fzll/article/details/。)
#pragma once
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
#ifdef LUA_EXPORTS
#define LUA_API __declspec(dllexport)
#define LUA_API __declspec(dllimport)
extern "C" LUA_API int luaopen_mLualib(lua_State *L);//定义导出函数
.cpp文件如下:
#include &stdio.h&
#include "mLualib.h"
static int averageFunc(lua_State *L)
int n = lua_gettop(L);
double sum = 0;
/* 循环求参数之和 */
for (i = 1; i &= i++)
sum += lua_tonumber(L, i);
lua_pushnumber(L, sum / n);
//压入平均值
lua_pushnumber(L, sum);
//返回两个结果
static int sayHelloFunc(lua_State* L)
printf("hello world!");
static const struct luaL_Reg myLib[] =
{"average", averageFunc},
{"sayHello", sayHelloFunc},
{NULL, NULL}
//数组中最后一对必须是{NULL, NULL},用来表示结束
int luaopen_mLualib(lua_State *L)
luaL_register(L, "ss", myLib);
// 把myLib表压入了栈中,所以就需要返回1
不理解没关系,我们先编译它,然后新建一个lua文件,在lua中我们这样子来调用:(调用之前记得把dll文件复制到lua文件目录下)
require "mLualib"
local ave,sum = ss.average(1,2,3,4,5)//参数对应堆栈中的数据
print(ave,sum)
ss.sayHello()
-- hello world!
成功调用了有木有?我们看到了输出信息。
至此都发生了什么呢?梳理一下:
1.我们编写了averageFunc求平均值和sayHelloFunc函数,
2.然后把函数封装myLib数组里面,类型必须是luaL_Reg
3.由luaopen_mLualib函数导出并在lua中注册这两个函数。
那么为什么要这样子写呢?实际上当我们在Lua中:
require "mLualib"
这样子写的时候,Lua会这么干:
local path = "mLualib.dll"
local f = package.loadlib(path,"luaopen_mLualib")
-- 返回luaopen_mLualib函数
所以当我们在编写一个这样的模块的时候,编写luaopen_xxx导出函数的时候,xxx最好是和项目名一样(因为项目名和dll一样)。
需要注意的是:函数参数里的lua_State是私有的,每一个函数都有自己的栈。当一个C/C++函数把返回值压入Lua栈以后,该栈会自动被清空。
Lua和C++是通过一个虚拟栈来交互的。
C++调用Lua实际上是:由C++先把数据放入栈中,由Lua去栈中取数据,然后返回数据对应的值到栈顶,再由栈顶返回C++。
Lua调C++也一样:先编写自己的C模块,然后注册函数到Lua解释器中,然后由Lua去调用这个模块的函数。
本文不涉及lua语法学习,如果有需要,请移步:
一、Lua与C++的交互机制——Lua堆栈1)交互机制Lua和C++ 的交互机制的基础在于Lua提供了一个虚拟栈,C++ 和Lua之间的所有类型的数据交换都通过这个栈完成
栈中每个元素都能保存任何类...
1.lua堆栈。
2.c++调用lua。
3.lua调用c++(静态链接方式和dll方式)。
使用hybrid模式,数据交互是一个比较关注的知识点。C++跟Lua的数据交互怎么处理。C++到Lua:
项目中Lua脚本的宿主是C++,lua库有给我们提供一些列的函数来实现。例如项目中希望在脚本...
Lua语言可研究的东西真是多,各种机制原理:与宿主语言(下文均指C/C++)的交互、内存管理(垃圾回收)、虚拟机实现、协程、闭包、异常捕获机制等。如取其一进行研究,要吃透还是需要点时间和精力。相信只要...
一、开发环境配置:
开发工具:
VS2012Lua 去官网下载源码自己编译生成Lua编译器连接器库等 (点击打开链接),winodw平台直接安装包安装,这样就不用手动配置环境变...
一不小心又标题党了?不好意思哈~
翻看了以前的博客,发下废话太多了自己都看不下去啊,恩,以后尽量写得简洁一些。
本文不涉及lua语法学习,如果有需要,请移步:http://book.luae...
本课程从实战角度讲解了流行的高性能脚本Lua与c++的联合开发,这套方案已经被大量的对性能由要求的系统使用,成为了高性能脚本的唯一方案,像大量的游戏在使用lua,比如魔兽世界、博德之门、仙剑奇侠传五等,高性能的视频应用也在用lua&c++(比如笔者的公司),还有近击败了韩国围棋的AlphaGo也是使用了 c++&的方案。
一、Lua堆栈
要理解Lua和C++交互,首先要理解Lua堆栈。
简单来说,Lua和C/C++语言通信的主要方法是一个无处不在的虚拟栈。栈的特点是先进后出。
在Lua中,Lua堆栈就...
VS环境配置:
http://m.blog.csdn.net/pangjiuzala/article/details/
Lua与C++交互:
http://www...
引用http://blog.csdn.net/yanjun_1982/article/details/7596171
今天上班的时候和程序对一个功能的程序接口,需求是这样的:脚本代码根据配置...
没有更多推荐了,c++问题求解,请大佬帮帮看看下面的题目,怎样才可以准确的输入不同类型的参数?谢谢!_百度知道
c++问题求解,请大佬帮帮看看下面的题目,怎样才可以准确的输入不同类型的参数?谢谢!
c++问题求解,请大佬帮帮看看下面的题目,怎样才可以准确的输入不同类型的参数?谢谢!编写两个函数Max,第一个max针对三个不同类型的数据求最大值,参数一为整数,参数二为单精度型,...
c++问题求解,请大佬帮帮看看下面的题目,怎样才可以准确的输入不同类型的参数?谢谢!编写两个函数Max,第一个max针对三个不同类型的数据求最大值,参数一为整数,参数二为单精度型,参数三为双精度型,第二个max类似第一个,不过参数一位双精度型,参数二为整形,参数三为单精度型。
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
你的回答被采纳后将获得:
系统奖励15(财富值+成长值)+难题奖励20(财富值+成长值)+提问者悬赏10(财富值+成长值)
虎从来不吃人
虎从来不吃人
获赞数:30
输入://例子:第一个MAXint&a;float&b;double&c;scanf(&%d%f%lf&,&&a,&&b,&&c);
这种做法是在c语言中可行的吧
可不可以不使用scanf这个函数呢?
在c语言中可行的,在c++语言中也是可行的,或者用cin(cin自动识别数据类型)//例子:第一个MAX//C++int&a;float&b;double&c;cin&&&&a&&&&b&&&&c;
好的,谢谢!
所以给个优解,好吗?
获赞数:10
擅长:暂未定制
只能都定义为双精度型了
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。我发现很多刚开始学习C或者C++的新人都会找运行程序的软件,然后不同的人会推荐不同的软件,
并为此争论谁优谁劣,最后好不容易下载一个软件下来,又会发现各种运行问题。
所以我就写了这篇 文章,有人再问的时候就把链接甩给他,让他一步一步跟着做。
这篇文章的目的就是让你下一个软件,用软件写一段代码并且能够完美的运行它。所以并不会解释 程序运行和软件的细节问题。
这篇文章的是写给 纯新手 看的,如果你有其他语言的经验,然后要学C++,我相信你已经有了IDE 之类的相关概念,
这篇文章参考一下即可。
软件的准备
这篇用的软件是。有人可能会说我教材使用的XXX,老师说要用XXX,
我想说的是能够写程序的软件有很多,我只是选择了一个简单好用的。我认为现在最重要的是把书上的那段 代码或者老师讲的那段代码运行起来,
当我们得到一个和书上相同的运行结果时,才是激动人心的 时刻。
下载及安装
到这个下载地址: 这个页面很醒目的标记的 Windows系统 下载的地方,它提供了6个下载选项,选择第四个下载
如果你搞不清楚,使用下面的链接直接下载
下载之后,打开安装包,一步一步点击下面图片的红框中的选项即可
到这里就安装完成了,因为Code::Blocks没有自带中文,所以需要我们手动汉化,想用英文版的同学可以直接跳过这一步。
使用linux的同学可以直接用包管理器安装,我相信如果你已经在使用linux了,安装一个Code::Blocks
应该是很简单的。
mac系统到这里下载
安装的具体步骤就不讲了,因为我没用过mac ^_^
首先你需要下载汉化文件: 这个汉化文件是网上大佬做的,感谢大佬
进入到下图所示目录,新建locale目录,进入locale,新建zh_CN目录,如果这些目录存在
就不用新建了
把汉化文件移动到第一步中zh_CN文件夹,如下图
打开安装好的CodeBlocks,点击菜单栏的 settings ,选择 Environment…
在左边找到 View, 按照下图的设置
点击 ok, 关闭Code::Blocks,重新启动,汉化成功界面
Linux下类似,只是新建 locale/zh_CN 的位置在 /usr/share/codeblocks” 这个目录
第一个程序
新建一个项目,步骤如下面的图
到目前为止就完成了我们的第一个程序的运行。接下来就需要看书加不断的练习了。
c语言程序的运行
C语言程序的运行
在嵌入式系统中,程序最终是要放置在内存中运行的,程序的几个段,最终会转化为内存中的几个区域。C语言可执行程序的内存布局如图13-5所示。
C语言可执行程...
C++ 编译,运行过程 详解。
要更深入了解C++, 必须要知道一个程序从开始到结束都干了些什么, 怎么干的。 所以我从C++编译到运行过程,解析下程序是怎么跑的。
首先,初略的说一下之前C++的编译过程,C++编...
c++程序的运行
本文转自:http://c.biancheng.net/cpp/biancheng/view/3253.html
C++ 和C语言类似,也要经过编译和链接后才能运行。在《C语言入门教程》中我...
C++程序的执行过程
要理解一个程序的执行过程,首先要理解什么是编译器。我们用C语言写的程序,计算机只能识别机器语言(二进制指令),计算机并不能理解。因此,必须 将C语言转换为机器语言。编译器就是用来实现这一功能的。编译器...
解决 C/C++ 程序执行一闪而过的方法
在 VS 编写控制台程序的时候,包括使用其他 IDE(Visual C++)编写 C/C++ 程序,经常会看到程序的执行结果一闪而过,要解决这个问题,可以在代码的最后加上 system(&qu...
上传者: wsqsoft000 时间:
综合评分: 0 积分/C币:1
微风Microsoft Visual &em&C%2B%2B&/em& &em&运行&/em&库合集 1.6 立即下载
上传者: qq_ 时间: 20...
上传者: dukong123 时间:
综合评分: 0 积分/C币:2
微风Microsoft Visual &em&C%2B%2B&/em& &em&运行&/em&库合集 1.6 立即下载
上传者: qq_ 时间: 201...
*详细原因:
交 微风Microsoft Visual &em&C%2B%2B&/em& &em&运行&/em&库合集 1.6 1积分 立即下载 ...
1. 概念初步
程序:计算机的程序,和做饭、运动会的程序一样,指的是“做事的先后次序”;
程序的组成:程序是指令(及物动词)和数据(宾语)的组合体;
C 语言 printf(&hello\n&);,...
采用VS调试程序,运行时窗口一闪而过的处理办法,在程序return之前添加getchar()函数竟然不管事了。于是查找原因,后面发现了以下几种解决办法以及对应的知识内容,记录下来。...
没有更多推荐了,但是难能可贵的是,这几种东西在C++混在一起用也是多么的自然。不过,这需要你花时间去掌控他。
那到底有没有必要真的学到这个地步呢,我觉得跟你的领域是有关系的。譬如说我,基本上算是人格分裂的,因为:
当我是不同的我的时候,我当然只会用C++的一部分来完成我当前的这个任务。这好像是多重标准,但是实际上是由于项目本身的性质而定的。
到了这个时候你会觉得,C++真是一门好语言。当你需要为了你的项目放弃不同的部分的时候,C++都能帮你做到。当你需要不同的抽象层次需要不同的性能要求的是,C++还是能够帮你做到。如果你用别的语言,你最终会发现那个语言只能做某几类的项目。这是因为,C++能够自由的让你放弃某些部分,而别的语言会阻止你放弃某些部分。
为了达到这个层次,你必须进入一个无限接近于精通C++的状态里,这个时候你才能收放自如,不被C++社区的各种不同的价值观所捆绑。倘若你的项目非常大,不同的部分有不同的特征的时候(什么,一个没有遍布全世界的一两千人写了20年的程序能叫程序吗?),就更加需要你有这种本事了。
说到这里,大家大概都明白精通C++大概是个什么感觉了吧——大丈夫能屈能伸。
170 条评论
最近在全职做c++程序的优化,发现这个语言真的是太复杂了。心累,但是非常有挑战性。我觉得精通c++这件事情是水到渠成的,硬来不行的。
-至少一次遇到 &Sorry, feature not implemented&
-至少一次遇到template报错长到你找不到头,因为terminal的buffer不够
-能看懂gcc想表达什么,而不再看gcc字面上写了什么(clang不算)
-代码里面看不到new/delete,再敢于用起new/delete
-各种design pattern的好处坏处都能理解
- 跟人在论坛上面大干一架
- 理解“精通c++”这件事情连committe都没几个人能做到,每个公司还对这个语言的未来有不同的理解
-放弃“精通c++”这个伟大而艰巨的任务
抖个机灵。其实个人理解,编程要上一个档次,要多接受不是跟c++直接相关的新知识。我对c++理解有质的飞跃其实是学了OS 和 OCaml/JavaScript了之后一波,上班之后被人code review是一波,修c++的程序又是一波。后面看meyers的书其实意义已经不是很大了。很多时候只是通过那些书了解这个轮子的细节,而不能理解这个轮子到底在那种车上跑,能跑多快,什么时候会散架。
谷歌工程师对C++的掌握有两个级别:
1. 拥有C++的readability(可读性)认证。通过这个认证需要在实际工作中写出一个比较复杂的完整的类,然后将这个类提交到一个委员会进行审查,委员会会帮你纠正常见的错误,如果你的这个类满足style guide[1]的所有要求,一两个星期之后你就可以拿到可读性认证。一般来说,你需要在实际工作中写过至少几千行代码才能达到这个要求。C++的readability对工程师的意义主要有两个,一个是熟悉并避免C++的缺陷(比如不要使用iostream和exception),另一个是熟悉一些常用的库函数(比如string的各种操作,hash_map和smart
pointer的使用等)。通过这个认证之后,工程师就有权利在code review中审阅其他人写的C++程序(注意这个不是readability review)。绝大多数工程师对C++的掌握处在这个水平。
2. 顾问级C++程序员。一般需要写过数万行C++代码,用C++实现过比较复杂的系统,熟悉常见的设计模式并在实际工作中应用,对代码重构有丰富经验,最重要的是,成为小组以及周围同事的C++顾问,是同事有C++使用问题时最先想到询问的人。顾问级C++程序员通常是高级工程师(senior engineer)及以上级别,不仅对某种程序语言,对工作中的各种工程问题也经验丰富。
其实“精通C++”并不仅仅是熟悉C++本身,你需要对C++需要实现的工程问题和周边问题同样精通;而且“精通C++”这种说法是相对的,如果你能成为组里的C++顾问,能够帮助同事正确使用这种语言有效率地解决工程问题并避免C++的误区,你就算是精通C++的那个人。
说实话看了楼上各位的回答后,我就不知道说什么好了,该说的都给说完了。
按照二楼的说法,我应该是属于“顾问”那一类的C++程序员。(跪
如果说熟练使用没有坑就是“精通”,那我想楼上很多人都能做到。但是在这里恐怕我猜楼主是想要个更加炫的答案。
的说法,C++是一个典型的多范式语言,不过他概括的还不够全面。C++是四类范式的组合体:过程式/结构化,面向对象,代表Lambda的模板(元编程),以及作为一个Markov Machine也具有图灵完备性的宏。此外还有一个我不知道怎么归类的type rich programming。
在这四类范式之外,还有各种各样的奇技淫巧。这里我说的奇技淫巧,并不是指Boost.MPL或者Loki那样的,那些其实都是C++基本范式中的衍生做法,都是最规矩的。
这里的奇技淫巧,给大家举两个例子。比如在C++03时候,还没有explicit type cast operator,那要安全的提供operator bool,还要利用member function pointer的特殊转化规则;又比如BOOST.AUTO在VS2008上利用了一个Bug完成的实现。奇技淫巧的问题在C++11消除了一部分,但是又增加了一些,比如说左值/右值引用的折叠,就是不是一个逻辑上自然的、而是设计后的产物。
此外还有一些坑。比如说重载-多态-名称掩藏、虚继承、指针的转来转去导致的问题什么的。
这些都还是最最基本的常识性问题。要是应用到生产中,就会变得更复杂。什么时候用继承,什么时候用模板,什么时候用多态,什么时候用宏。好在有一些前辈已经给我们淌了路,比如说Shutter,比如说Meyes。熟读 6E(Effective C++,More Effective C++,Exceptional C++,More Exceptional C++,Exceptional C++ Style,以及Effective
STL),这大概是进阶的唯一阶梯。
再往上你学C++就没啥用了。多学一学其他语言,例如Haskell,ML,Javascript,C#,自己做一做编译器,了解一些语言设计上的常识,读一些形式化系统的论文,都会帮助你对C++这么一个复杂而丑陋的语言产生更多的同情。
当你开始觉得:C++的设计者真可怜;埋怨英文标点实在太少并开始同情BS;决定自己卷起袖子撸一个的时候,大概你就算是精通C++了。
当然撸的好,就是Rust;撸的不开心,那就是Go了。
Never trust a programmer who says he knows C++
精通没有标准,但学习有路径。 我来说说 学习掌握C++的路径吧,从低到高,分0~10级:
0级:掌握常见C++语法和语言构造,能够顺溜地写清楚各种语言构造(很多小白鼠死在这里)
1级:掌握基本的编程范式:面向过程、面向对象、泛型编程、以及C++11/14支持的函数式编程
2级:清楚编译器在 后面干了什么(compiler under the hood-考验功力的时候到了)
3级:清楚运行时内存模型(memory under the hood)
4级:对经典库(包括但不限于STL, BOOST, Folly)应用熟练,关键原理清晰,掌握设计模式
5级:熟悉至少一个操作系统常用API和内核,调试工具和方法
6级:有清晰的机器和系统模型:CPU, Memery, Cache, GPU, Disk, I/O, Process, Thread, TCP/IP...
7级:有一定系统级应用开发经验,被系统级应用的性能、内存、规模等问题折磨过,并解决过...
8级:从头到尾设计过一个C++库、或框架,并被一定量级的应用使用过
9级:设计并开发过系统级、高性能、大规模的软件系统
10级:成为Bjarne Stroustrup,设计一门语言
当然,这些打怪升级并不完全线性递增,有些需要综合运用。修炼则需要 研习+实践,反复螺旋。
最后安利一下我正在主持操办的“(10月28-29日,上海)。C++
之父Bjarne Stroustrup 将出席并发表keynote演讲:《What C++ is and what it will become》 ,除了Bjarne之外,还有C++大神Andrei Alexandrescu,Mike Spertus等。
就拿这次会议的嘉宾来说,个人认为,Bjarne Stroustrup和Andrei Alexandrescu当属于第10级(别忘了Andrei除了在Facebook做了7-8年研究科学家,还是D语言之父)。 Mike Spertus 属于第9级(Symantec Fellow),然后大会其他嘉宾基本集中在第7级~8级之间。
偏一下题,提一下几个微小的意见。
感觉不应该去精通某一门语言;而应该去精通某一个领域,然后附带着理解跟这个领域相关的知识点。而编程语言是这些知识点的一部分。
比如搞操作系统的,就附带着了解C/汇编,附带着了解32位寻址的知识。
搞网络的,就懂得处理各种复杂的情况,处理各种琐碎的断线重连/容灾备份等问题,熟悉网络编程的各种坑。比如tcp/ip协议,比如epoll模型等等。
我自己是做OCR的,那么我需要的就是模式识别方面的知识。至于语言,为了做界面我用OC,为了性能和可以方便调用opencv我用C++, 未来还可能为了快速原型开发用一下lisp。然后就是各种专门的算法,比如图像中提取字符的算法,svm等等。
如果把程序猿比作士兵,那么熟悉编程语言就等于熟练基本功。但是不可能7-8年一直熟悉基本功吧。投入3年左右的时间做基本功,然后就应该想法子投入专门的战场作战。然后在战场中再熟悉各种专门的基本功。
======================================================
回到题目上来。感觉还是lisp好。要精通也是精通lisp啊……
独立写出一个 C++ 编译器工具链(预处理-前端-后端-标准库)。
这是少数有效的充分条件。
ps. 有鬼佬推出了它的认证:
对于精通方面,我的理解是实用主义。
像轮子哥说了很多C++特性,很多我没接触过。身为一个架构师,比较汗颜。
但我个人奉行实用主义。所以在C++方面,我的学习是这样:
1. 一定要掌握调试。调试掌握的程度呢,我个人是达到汇编级调试。基本上,基本上C++那些数据类型,通过调试,我都在汇编级别了解过了。
2. OO思想一定要掌握。能够很快用UML把逻辑了解清楚。
至于那些特性,该用时就用,不用管。
“怎么才算是精通xxx”这个问题太难回答,无论标准如何定,都会有人不同意,不是嫌高就是嫌低。
“哪些人算是精通xxx”这个问题比较好回答,具备可操作性,不如我们先解决这个问题?
我肯定不在精通C++的人里边。
哪些人算是精通烹饪?你认不认识这样的人?
哪些人算是精通摄影?你认不认识这样的人?
哪些人算是精通驾驶?你认不认识这样的人?
哪些人算是精通骑自行车?你认不认识这样的人?
哪些人算是精通弹钢琴?你认不认识这样的人?
精通就不必强求了,live is too short to program in C++.
学习 C++ 可以经过这么几个阶段。第一是找一本不太「膨胀」的 C++ 教材。基本上掌握 class , overriding, overloading, 最简单的 template (完全不用掌握 partialization )。
第二步是好好阅读《 The Design and Evolution of C++ 》。因为有人说过,一门学科的全部就是它的历史。
接下来你可以学学编译原理,看看高级动态语言,为第四步做准备。
第四步,也就是最最关键的一步。好好看看 C++ FQA (没错,不是 FAQ ,不是 frequently asked question ,而是 frequently questioned answer )。
这些揭穿了 C++ 设计者从自身角度文过饰非编写的春秋笔法。《 The Design and Evolution of C++ 》解释了 C++ 为什么是一个怪胎,但是它还是一个怪胎。
C/C++总共分成四大流派
1.c风格流派
2.面向对象流派
3.模板元流派
4.混合流派
很难全面掌握C++,这个语言一共有18个以上的大的知识点。比其他语言要多出1~2倍,复杂度则要提升到3~4倍。先确定你要用的内容,然后再学习即可。
比较合理的路线是:先从c风格学起,逐渐接触面向对象,再过渡到模板元,最终做到综合使用。
但是,每一种流派都存在自身的优缺点,不存在谁比谁更好的问题。比较著名的程序员中,云峰是c风格的,免费打工仔则是模板元的。
而对于大部分人来说,熟练掌握面向对象已经能够很好的完成工作了。
今日看到大把的同学的简历上都写着“精通c++”,”精通xxxx”,其实他们可能只是会写个helloworld,知道class是个关键字而已吧.其它的我都不是太懂,唯独c++研究过些时日了,自己心中的精通为何也早有定义:
1)知道所有关键字的含义,这个是最基本的.有很多很少用的也必须知道..比如auto,mutable,explicit,volatile...
1.5)通读过一遍 ISO C++标准
2)STL的使用和基本实现原理.
3)《Effective C++》,《More Effective C++》...之类的经验手册型书籍熟读3本以上,其中大部分条款要烂熟于胸
4)boost库的整体框架要了解,清楚其中某些实现的超级BT的库不能被某些编译器编译的原因。还要清楚哪些库将会被iso c++ 收录...用到某些功能的时候会不由自主的想到“boost 中有这个功能?”结果花上比自己手写还要多的时间去使用boost.
4)看过Moden C++ Design,loki的实现原理要清楚..当然也要知道loki是干什么的...
5)林锐的《高质量C++编程指南》后面的习题能得到90分以上(记得是第一次做,以后补的不算!)。
6)C++中的线程安全模型是怎样的。
7)C++中的字符串处理库,包括C++对unicode,多种语言编码的支持。
8)预编译命令都知道是用来干什么的和常见的使用习惯...
9)平时最常用的一个编译器的所有编译选项熟记于心,以及他和ISO C++定义的编译器的差别
10)这条凑数...不管怎么样,也要会用gcc...这样保证了在每个平台下面 都可以编译个helloworld
按上面的标准查看下自己...还是要继续努力啊...
以上内容转自
怎么样才算是精通汉语?
怎么样才算是精通英语?
从来没有一个成熟的人问这样的问题。
因为语言是千变万化的,你会语言写出数学定理,但你不一定能用语言写出艺术作品,你会用语言写出艺术作品,但你不一定能用语言写出工程产品,你永远有不精通的一面,而是你永远只是精通一小细节,如何只用英文26个字母加符号排列组合在10亿的字符串上,整个排列组合是天文数字,整个人类加在一起不能说精通了某某语言,更何况是个人。
就算是语言的发明者,也只是撑握了把语法翻译成二进制的方法,而不是精通语言本身。
如果能用某语言不带参考写个冒泡排序就算着精通,那只能算着精通入门。
c艹毕竟只是工具,掌握到可以满足自己设计的需求的程度就够
除非你研究编译,否则对语言本身不必刻意深入。一些边边角角的知识和一些坑,一边做东西一边也就了解了
而是否做出有价值的东西取决于算法水平
精通使用筷子却营养不良,这岂不是更大的笑话…
coolshell.cn
既然C++是一种语言,如同我们去判断一个人精通英语或者汉语的标准类似,要能用,够用,可用,成为你思维中的第一工具而自然运用(而不是经过母语在中间适配)。要求他能够听说读写,能够无障碍的与人交流。即便如此,一个人掌握的单词汉字,也仅仅是字典中的一小部分高频词汇,大部分其实是他不认识的(但是这些字使用概率很低)。对于C++,就是能够自如的运用这个语言完成你想要的,能够使用别人的代码和成果,能阅读其他人的代码,能与其他人交流。由于
c++ 包罗万象,应用方向特别多样化,堪称博大精深,所以要精通所有方面肯定是不现实的。
业界潜规则:在c++这一领域,不能用“精通”来修饰。最高级别是熟练,“精通”对于c++这一行,至今保持空缺。(此乃大家心照不宣达成的共识)
请谨记这一点,以免让行内觉得你是个外行人士。
不同的人有不同的风格和路子,尤其是在 c++ 这样的语言上。
知道怎么自己写makefile.
用别人的makefile编译出错知道怎么找到哪里错了。
我这答案真不是抖机灵,见过太多连“链接”是什么都不知道的“C++程序员”了。
其实C++在很多领域都有应用,通讯、视频处理等,看你说的要从哪个领域来看,其实C++的各种特性是基础,关键你还要掌握所在领域的一些处理技巧,例如你要做一个基于IP网络的视频客户端,你除了要在程序中实现播放图像的逻辑,还要根据实际情况处理好通过网络传送过一的视频缓冲技巧,在适当的时候使用不同的通讯协议(如控制信息用TCP/IP,视频流用UDP之类的技巧),还有就是如果跨平台的话,还需要考虑不同平台的字节序(例如JVM的字节序与Windows是相反的,你需要留意并处理)。以上等等等都不一定是C++的内容,但需要使用C++去处理实现,在这个实现过程中,你会不断遇到问题,不断找方法解决,一个过程序下来,你会遇到很多新的关于C++的各种处理方法了,每处理一个问题,你就知道多一点C++的知道,知道多一样不同情况的处理技巧。但这样是精通了吗?精通是个很虚泛的概念,可能你在用C++处理通讯问题的时候已经很熟练了,但你不一定熟练掌握3D渲染在C++上的实现,那算是精通C++吗?
C++11出现之前要说精通还是有可能的话,现在这一点微薄的希望也被剥夺了。看一看目前支持C++11标准最全的GCC
,GC依然不在支持之列。编译器都没完全搞定,谈何精通。
作为一门编程语言,从来没有谁像C++那样博大精深,简直就是所有编程语言的杂糅(专业造轮子的@vczh君说得很详细了)。精通?下辈子从娃娃抓起吧。
若干年前,我用C++模板写了个字符串库,可以实现编译期的字符串运算。
很高兴,觉得自己足够精通C++了。Talk is cheap, 刚上传的code 在此 --
直到后来,听说有个叫boost的东西,发现自己写的东西,在boost里面看来,是再基础不过的玩样。迷惘啊,懊悔啊,苍天啊,大地啊,怎么叫人活。。。
再后来,我不在追求精通C++,还是想想怎么将代码转换成生产力吧。
简单定义C/C++&精通&本身就很难. 我的感觉是做的时间越久越发现没有所谓什么精通吧, 越做越发现自己根本谈不上知道, 总会有很多东西你闻所未闻...
在北美面试的时候一般总会问这个问题: &你觉得你对C/C++的水平打多少分?& 刚毕业的时候我总是说: 对C我能打9分, 对C++, 怎么也是7-8分.
现在如果再有人问我, 我会说&单纯语言上C我打8分, 如果是在Linux开发C, 我说6分, 原因是在Linux上开发不是简单的了解语言就足够, POSIX, Threading, 所有System APIs, 包括开发Kernel都需要更广泛的知识, 两者不可分&
对于C++, 我只能给自己打6分, 同样的道理, 对于STL或者BOOST我都不敢说&精通&, 又有几人真能精通所有BOOST Libs? 缺点优点, 何时用, 何时不用? 根据产品的不同, 每个项目的侧重点也就不同, 用到的Features也不同, 更何况C++本身也在进化, 新的x0就加入了Threading的Support, 学以致用, 学无止境....
我刚毕业的时候,简历上写,熟练运用C++
后来工作了几年,简历上写,精通C++
再后来我发现,每当我觉得我已经会C++的时候...
总能在不经意间遇见一些CPP代码让我相形见绌...
于是我把简历改成了,会使用C++...
这一阶段需要比较艰辛的过程,需要学习很多书,包括《C++ Programming Language》,
,《More Effective
,《Thinking in
,,《C++
,如果上述书籍已经很熟悉了,本人认为,在学习阶段,已经很不错了。该过程可以在大学完成,需要一到两年的时间,应为是纯理论的东西,只能算熟悉。在该过程中,需要做一些简单的程序。
咱们是做工程的,不是语言学家。会用就好,实践中逐步完善,何别要精通?
就像我们用中文一样,能沟通就可以,不能奢望成为国学大师。
精通是什么,是你要明白C++里边的各种道道,随便一个点,能讲一大堆。这个太难了,在我心目中,精通c++也就是说,你可以自己另外创造一门新的语言了,说白就是武功绝学你不但学会了,而且还能创造出新的绝学,最后三个字,科学家级别的人物
Bjarne Stroustrup说:如果10分满分,他对C++的了解是7分。
他还说过:学习一门语言,其实不需要了解这门语言的所有细节,那样毫无意义。
学懂是一个感觉一个爱好。看懂一本书,thinking in C++ .用它理解程序,就可以算学懂C++了,现在很多人都去学 java ,c# ,其实学好了C++ ,那些就自然理解了,而且理解得更好。例如前面知友引述的google验证级别,基本可以达到语法水平。但是这样没什么用,只能给别人看某部分的程序BUG。个人觉得,其实觉得做程序的最重要是要形成自己的系统和体系。从这点来说,我是学懂c++的。做程序的之所以又累又忙,一个很大的原因是没有形成自己的体系或系统。一旦形成了,你就有一方天地,这个天地里,享有造物者的权利。
我对C++的学习程度的定义(仅限于20xx年之前,Unix/Linux下的C++)
1、熟悉基本语法,能写“hello world”类;
2、能写出一个独立系统,小的也行;
3、对程序设计的某个领域深入了解
领域指:进程管理,线程管理,网络编程(可细分为进程间通信,系统间通信),I/O控制,外设控制等。
深入了解指以下几个级别
1)熟悉几乎所有基本原语(不熟悉的可以理解成API,层级不同,使用起来类似)
2)了解他们的使用方法
3)知道经常容易犯的各种错误
4)能够进行性能调优
4、对多个领域有深入理解
领域的解释如前。
深入理解,在深入了解的基础上增加:
5)熟悉几乎所有原语的实现原理;
6)能够透过C++语言的基本原语看清系统CPU、内存、寄存器等的使用
7)遇到不熟悉的领域能够在数小时之内达到熟悉的程度。
工作中大概这么衡量身边人的,以后想起来再补充完善。
精通C++,个人的理解是:
1、能用C++的面向对像设计,分解,开发一个模块或小系统
2、在出现BUG的情况下能调试
3、熟悉对像,继承,模板,能使用STL,BOOST
4、能熟悉几个常用的设计模式
5、在此基础上,在GOOGLE大神的帮助下,能阅读开源或闭源的源码。
其它的,我觉得实用性不强了,去抠语言的细节,语言的实现等,那不叫精通了。那是神通了,反正我认识的技术牛人,人家是去抠系统,原理上的细节,很少去扣语言的,本来语言就是一个工具,用好他,坏了能简单的维护,管他是怎么实现的。
的熟练应用
综上所述,如果你能达到第3个阶段,在我看来已经算是精通了,模板元的语法比较晦涩且难以驾驭,用模板元编程方式基本上人脑就成了编译器,但是有牛人已经用模板元写好了库,Boost库中就有专门的模板元库,可以大幅度简化程序,但是似乎更难以看懂。
这个问题的确很难讲清楚,可以从这几个方面下手(这是一个死循环体,1-&2-&3-&1):
1、C++的发展历史,包括为什么会出现C++、C++的具体应用、C++的发展前途等,在互联网上好好查查,利用好各大搜索引擎,对C++先要有一定的“感性”(初步)认识;
2、C++的编程思想,包括对象、接口、继承、多态、异常处理、STL、IOstream等编程设计思想,找本厚书,把门窗都关上,使劲的“啃”,理解了的东西才能更好地感觉到它;
3、C++的项目开发(还要学很多其他技术),包括开源项目整改、各种类库开发、外包项目承接等,写个东西,能解决实际问题,并得到使用者的一致好评,正所谓实践验真知。
能做到这三点的,在别人的眼里,都是精通C++的大牛;但他们自己却认为这只是用C++完成个项目而已,接下来还有很多新东西要学。
所以说精通就是要循环地去做这件事,一旦跳出来了,也就成了过去时;“我以前很精通这个的!”你信么?至于你信不信,反正我是不信的!
我理解的精通是这样的:精确了解 C++ 的优点与不足,熟练应用 C++ 不同范式进行编程,在实际项目与产品中,尽量做到扬长避短,如果没有办法规避缺点,可以在 C++ 之上做一些扩展(比如:语法糖,编译期多态,或者 QT 那样的)来解决问题。
能分辨一个项目的哪些部分不适用C++并解释理由,才能算“开始精通”C++。
为了精通而精通,就没有意思了!语言创造出来时为了解决问题。之所以使用C++,就是开发速度比c高一点,执行速度比java多一点。使用c with class能解决的问题就不要使用其它的。越复杂坑越多。解决问题为第一要务。简单的方法能解决问题的就不要使用复杂的方法。
如果你是想精通C++所有语法,可以明确回答你,99.99%不可能,0.001%则是留给写C++编译器的人。包括你,包括我,精通C++所有语法又能怎么样,代码比的是哪个更实用、更简洁、更易维护,而不是摆弄什么高深语法。  一直是把C和C++看作同一语言,因而以下就用C/C++代指。
一、精通C++的学习路径。比如需要阅读哪些书籍,参与哪类项目,完成何种开发体验。  C/C++语法很多,但不少语法没必要默记于心,甚至不会也无所谓。  C语法。这是基础,你须要全懂。指针让很多人对C/C++产生恐惧,但你必须很懂指针,这是C/C++精髓,看书只是让你知道指针是什么,至于精髓须要你在不断写代码中自个去体会。对指针,我认为有一处可以不用理会,类似“int
const *”,即指针符号在const后的,原因是已经在用常见的“const int *”,没必要再给自个添麻烦。注意,要彻底放弃goto语法。  C++中和类相关的基本语法。像构造函数、析构函数、派生、重载、操作符重载,纯虚函数,等等。  以上是你没开始写代码前得有的,说来不难,买本C/C++教材估计就行了,看时不必太深究一还是二,后面的代码自然会让你深入。至于STL、Boost你可以边看代码边学习。接下来就要进入代码,不断看代码、写代码、调试代码是精通C/C++的学习路径。看代码也是有讲究的。  1)花一天看代码不如花一小时用调试器跟踪代码,所以请先安装能支持C/C++调试的IDE。一般人都在用Windows,安装Visual
Studio,版本越新越好,当前是Visual Studio 2015 + update3。不要用什么Code Blocks,选择编译器标准不是是否开源,而是它的功能是否足够强。调试功能强与弱会极大影响你看懂他人代码、自个编写代码的效率。  2)上网找开源C/C++项目。对这项目要有几点要求,1)容易编译,下载后一个Build命令就要能成功,并能运行。要能让这项目编译成功并运行是接下所有事情的先决条件。此时你可能连Visual Studio都是生疏的,不要把自个绕进IDE的套子里去。2)知名度高,该项目代码是经过众多高级C/C++程序员参与编写。3)实用,它在那一领域已几乎成为标准,并有很大发展潜力,你将来编程时就可用它的功能。  看哪个项目?强烈推荐Google的Webrtc。虽然它的代码量很大,但看的目的不是要全看懂,只是看你想看的部分。语法上,Webrtc用了最新C/C++语法,像std::unique_ptr,因为这个,Windows上编译必须Visual
Studio 2015 + Update3或以上。实用性上,Webrtc是视频聊天基础库,众多知名浏览器都是基于它实现视频聊天。扩展专业知识上,Webrtc为完成聊天涉及到很多方面,像网络穿透,视、音频编码解码,采集摄像头、卖克风,截屏。C/C++编程技能积累上,Webrtc能让你直接基于它的一些模块写代码,像多线程同步模块(),网络收发模块。获取更多开源项目上,Webrtc像手心,基于它你会涉及到很多开源项目,像用于加密、解密、网络安全的boringssl,数字编解码的ffmpeg,libvpx,等等。活跃度上,Webrtc是Google底下团队维护的项目,基本做到一个月一小变,不仅能让你获得那些专业的最新技术,还能学习最新C/C++语法。还有很重要的是,Webrtc代码是跨平台的,完全支持当前主流操作系统,像Windows、iOS、Android、Mac
OS X、Linux,到时你会发现,C/C++是种多么好的跨平台语言。——当然,Webrtc下载、编译是个麻烦事,在此毛遂自荐个项目:,下载它,然后下载那里一本书,参考第一章一段话,运行Visual
Studio 2015+Update3,就一个Build命令,你就可以进入视频聊天然后深入学习Webrtc代码。  Webrtc非常值得深入,甚至认为可以进入大学课程。
二、能力达到何种水平,才算精通?代码经验,项目经验,开发技巧等等。  和其它语言一样,评价你精通一门语言标准,我认为不是你是否精通这语言语法,而是你能否用它写出大众认可的好代码。注意,我指的是代码,而不是app,判断好代码标准,除了运行它会是好app外,还有像是否简洁、是否易维护。代码不是光给自已看,你要让别人也容易看懂,代码不能因你而“断”掉。  基于以上标准,我是建议不要用高深语法。以下说说自个对STL、Boost这两个库看法。注:看这两个库时,我没看过专门的书,都是看代码时碰到问题了就网上查下,慢慢就会了。  STL。这个库要熟练会用。string、vector、map、set、list、queue、stack。对multimap,能不用就尽量不用。  Boost。Boost库非常大,我列举认为很实用的。boost::bind和boost::function,让实现变参回调。boost::iostreams::gzip_compressor等,实现数据压缩、解压缩。boost::regex,处理正则表达式。至于其它的,我就不用了。我对泛型持保留意见,自个代码是不会去用的,至于他人用泛型写出代码,能看懂什么意思就行了。
三、精通C++的学习成本。诸位大神分享一下,学习曲线,学习过程,以及走过的弯路。  根据上面写的,C/C++学习曲线简单归纳就两步。  1)看书学C语法,C++中和类相关的基本语法。大学有开过C/C++语言课程的,课上教的就满足这条了。  2)安装Visual Studio,下载开源项目,看代码、写代码、调试代码。STL、Boost都可在代码过程中由入门到精通,只有看到它们被如何使用才能更好理解并掌握。  只要进入Webrtc,它会自然地让你去触及各个方面,不论是C/C++语法,还是专业知识。“能把编程做成一门艺术,估计只有C/C++。”没人敢说他已到达C/C++顶峰,学习过程就是不断获取未知知识、摔倒、总结教训,然后再获取……
四、如何高效提升C++水平。
  不断看代码、写代码、调试代码。
亲手实现一个编译器和调试器,编译效率和运行效率能做到和符合最新的标准的编译器一样的效率和健壮性,那就能说精通了,其他水平的人都不能说是精通,比如有人用C++开发作品的经验达有效代码量100万行至1000万行。自称用得出神入化,天花乱坠,但是如果就是没有去实现一个符合条件的编译器,那还是只能说熟悉C++,而不是精通C++。
译过,C++专家谈不上,算爱好者吧。
我个人感觉所谓精通,其实C++也好,什么也好,主要还是看两点。第一,你可以使用某种技能来解决现实问题。就是说,具体到某一个编译环境,某一个标准库实现,面对某一个需要通过使用C++来编程解决的现实问题,或是在解决问题的过程中出现的故障,你可以搞定。尤其是在大多数人搞不定的时候,你可以。第二,就是你不仅能够使用C++来解决问题,你还知道如此这般地解决问题的原理何在,或是可以在若干种可选方案中做出取舍并清楚地知道取舍的理由。
概括地说:就是你能够熟练地应用C++,并且你还知道现象背后的原理,这就叫精通。事实上,C++也是在不断演化的,我在时,他就谈到了关于C++不变的哲学和万变的实现之间的关系。 要追逐万变的实现(标准也在快速演化中)即使不是不现实的,也是事倍功半的。唯有在实践中不断地加深对于不变的哲学的理解,才能够迅速成长。从哪里着手比较好?我看就是从意欲使用C++解决的问题着手,是最好的切入点。
正在准备放弃C++的路上。
本来想在知乎上搜一下这个话题,希望能够寻求一个点让我继续坚持C艹的星星火苗,但是看了各位大佬的回答之后,我觉得我可能是死在第一步的小白鼠了,嘤嘤嘤。。。
干嘛要精通啊? C++之父都没有达到这个境界.
不要对自己要求太高
能自己动手写一个100%标准的C++编译器和标准库, 就说明你真的精通了
职业程序员,用了十三四年,依然是小白。
学校的时候,大头书看得头痛,生硬理解概念,现在看来完全不知所以然,但仍经常为自以为懂了一个新特性高兴。那时候还经常为不知什么目的做点练手小程序,当然全是垃圾。
毕业了因为会一些CPP而找到一份不错的工作,坐标海外行业金融,薪水是大多数同班同学的十几倍,那时候个人标签是狂,在大多数人因为难度大而转投JAVA服务器端开发的年代,会点CPP能不狂吗…
工作头两年开始被CPP疯狂的折磨,参与到项目中打下手,全是坑,打印出来几米长的bug单,经常为了查一个崩溃要连续一周每天只睡一小会儿,最后人崩溃。最奇葩的是有人实在受不了,为了通过测试在程序里面设置各种标志位,然后跳槽走人。
工作三四年,逆袭翻身当leader,有了项目话语权,一些设计可以按自己思路走,终于可以施展CPP语法绝学,高级语法,模板满天飞。团队三四个人,干得很好,觉得CPP确实牛逼,效率高,开发方便。团队扩大了,觉得bug怎么冒出来这么多,要找到十个人都精通CPP的语法和特性,真的好难啊,成本好高啊,万一混进来一个猪队友,大家就得通宵陪着加班找bug。
后来老子也辞职不干了,回国创业,发现JAVA真是个好东西,普通学校招一帮子人也能干得风生水起。底层的东西一两个人用CPP搞定,其他能JAVA就JAVA,或者C#。或许这才是最好的模式。
再后来业务领域更专了,要的是结果,至于用什么语言,who在乎。现在更多时候我是在单打独斗,由于习惯原因,加上专业领域的特性,主要还是使用CPP,但我其实想要的是C,无PP,飞一般的编译速度,清晰的结构,灵活的跨二进制接口。
说了这么多,似乎和精通CPP没有什么关系,但现在真的在把CPP当C用,析构函数自动释放资源,太TMD爽了,其他,呵呵。标准库?什么语言没有自己的亲生儿子?STL各个方面都比.NET Framework中对应功能好吗?
再说专业,比如做量化交易,有没有策略和想法,远比会用CPP重要,给个赚钱的idea,只要保证不出乌龙指,程序偶尔崩了,跑慢点又如何 - 场景不同,需求不同。
所以,越简单越好。大部分的人,领域知识比语言工具更重要,我精通不了CPP,所以把使用限制在最基本的层面。
至于OOP,有时候觉得流水账程序嵌套简单的函数调用,比为了OO而OO效果好,除错方便,维护简单。
其实c++简单得很.
说难的都是忽悠人的.
有人又吹自己十多年都精通不了.
我靠,自己不行怪c++难.
然后,就来讽刺说什么中国人没几个精通c++的人.
然后,又说当前国外精通的人又多得很.
唉,一切的一切不就是打击中国人的信心吗?
除了装逼,吹牛逼,你们能干什么?
c++好难嘛,
正常的一个高中生,现在花个一两年,都能搞定.
谁再吹精通c++难,就是装逼犯.一辈子就会吹.
传说21天精通c++的办法........
在简历上写了“精通 C++”后……
https://zhuanlan.zhihu.com/p/
“亲爱的xxx同学,您好!恭喜您通过了 xxx 公司的笔试!请您于明天早 9:30 到 xxxxxx 地点进行...
精通 C++ 有多难
Question: On a scale from 1 to 10, how do you rate your understanding of C++?Bjarne Stroustrup:7By “...
知乎-怎样算是精通c++
**怎么样才算是精通 C++?
对提问作补充几点:
1. 精通C++的学习路径.比如需要阅读哪些书籍,参与哪类项目,完成何种开发体验.
2. 能力达到何种水平,才算精通?代码经验,项目经验,开发...
C/C++从入门到精通(入门、进阶、精通)
今天在网上偶然看见许多大师在讨论如何学习C/C++,大牛们推荐了一些书籍,个人觉得很不错,怕以后想学的时候找起来费劲,所以给整过来了。(本文转自大牛、大师们)
我的个人的拙见可以这样学C++:
...
什么叫精通C++
常用的面向对象复用模型设计、常用的数据结构设计、常用的操作系统知识、内存管理、多线程互斥,然后能够很轻松的应用现有的软件模块和开发库,比如用开源的库(例如log4cpp),购买的其他公司的接口模块等,...
精通 C++ 是个毛意思
精通 C++ 是个毛意思
c++多个源文件共用一个全局变量(extern 的用法)
例子:头文件:state.h
源文件:state.cpp
其它源文件:t1.cpp
这些源文件都包含头文件state.h。需要定义一个全局变量供...
没有更多推荐了,}

我要回帖

更多关于 感谢大佬什么意思 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信