初学者对C++程序设计语言(特别版Bjarne Stroustrup)学习疑问1-9章

aluow 2016-12-23 08:59:30
1.    第5页:“标识符用的是比例宽度的字体”和“程序员已经习惯于采用等宽字体的代码”;
问题:“比例宽度”和“等宽字体”是什么含义?
2.    第13页:“任何有关静态类型语言的经验对于学习C++也能有所帮助”;
问题:什么是静态类型语言?是否还存在动态类型语言?比如什么语言是动态类型的?
3.    第13页:“如果要符合C的连接规则,一个C++函数就必须被声明为具有C连接的。”
问题:什么叫具有C连接?具有C连接有何实际用处?如何声明为具有C连接?
4.    第14页:“一个程序常常能组织为一组类,或者一组类的有向无环图”;
问题:什么是有向无环图?这个概念术语来自哪一门课程?
5.    第16页:“不要在一个类里面放‘类型域’;采用虚函数。”
问题:什么是类型域?
6.    第19页:“……写出好程序的一种范型”中的“范型”;
问题:“范型”与“泛型”的含义和区别?
7.    第23页:“一集相关的过程与被它们所操作的数据组织在一起,通常被称做一个模块。”
问题:“一集”是什么含义?
8.    第65页:“典型的情况是有关字符集采用ISO-646的某个变形,例如ASCII”
问题:“什么是ISO-646”?它与ASCII有何异同?
9.    第66页:L’ab’中的L是什么?“放在引号间的字符个数及意义由实现根据wchar_t类型确定。”---这句话如何理解?
10.    第66页:“通过将变量声明为unsigned而保证某些值始终为正的企图常常会被隐含的类型转换规则破坏。”---这句话如何理解?
11.    第70页:“举例来说,对于enum e1{dark,light},在sizeof(int)==4的机器上,sizeof(e1)可以是1,也可能是4,但绝不会是8。”
问题:为什么可以是1,也可能是4,但绝不会是8?如何理解?
12.    第77页:“如果我们在所有需要可能较大的整数的地方都用int32,那么就很容易将我们的程序移植到一个sizeof(int)是2的机器上,因为只要在代码中重新定义int32的惟一一个出现typedef long int32。”
问题:为什么很容易?怎么理解很容易?
13.    第82页:“两个同样的字符串文字量是否被分配在一起,这一点由实现确定。”
问题:什么叫被分配在一起?实现如何确定?
14.    第83页:“在某些机器结构中,数组常常被分配在机器地址的边界上,所以‘数组开始元素之前的一个位置’根本就没有意义。”怎么理解?
15.    第88页:“可以通过对const指针的显示类型转换,明确要求去掉这种限制。”
问题:什么限制?
16.    第91页:“在那些为优化而使用的地方,可以将void*隐藏在类型安全的界面之后”
问题:什么是类型安全的界面?
17.    第91页:“到函数的指针和到成员的指针都不能赋给void*”
问题:为什么?
18.    第94页:“避免非平凡的指针算术”“避免在代码中使用非平凡的文字量”?
问题:什么是非平凡nontrivial?
19.    第98页:“对于一个应用于内部类型运算对象的二元运算符@,表达式x@=y的意思是x=x@y。”
问题:@是什么含义?
20.    第102页:“由于前面将运算符的Token_value值定义成该运算符的整数值(4.8节)”
问题:书中4.8节没有这个内容,此处何意?
21.    第103页:“让get_token()记录行的编号,将使error()能够通知用户出错的大致位置”
问题:get_token哪里记录了行的编号呢?
22.    第104页:页中部“expr(false)”
问题:expr是什么函数?false是什么作用?
23.    第106页:“对于不熟悉关联数组的程序员而言,采用标准库的map作为符号表似乎是一种作弊”问题:何为作弊?
24.    第107页:“(2.5.2节、第11章)”
问题:这个内容在书中哪里?第11章根本就没有这一节的编号。
25.    第107页:“表格中的类型识别typeid(type)和运行时类型识别typeid(expr)”
问题:这两者的含义区别?
26.    第107页:“表格中的类型的大小sizeor(type),补~expr,非(否定)!expr”的含义和用途?
27.    第108页:“表格中的建立(放置) new (expr-list) type和建立(放置并初始化) new (expr-list) type (expr-list)”什么含义,怎么用?
28.    第108页:“每个间隔里的运算符具有相同的优先级”,“间隔”是指什么?
29.    第109页:“错误:x++不是一个左值”,是否就是说x++无地址?
30.    第110页:“逗号表达式(v[i],i++)如何求值?”
31.    第110页:“if(i<=(0||max)<i),为什么是合法但却是一派胡言?”
32.    第112页:“请想一想将一个表示正在被处理的中断集的位向量,与另一个需要去处理的中断集的位向量相比较的问题”这句话是什么含义?
33.    第117页:“算术类型之间的缩窄转换(C.6节),从整数到枚举的转换(4.8节)和用户定义类型的对象构造(2.5.2节,10.2.3节)。”什么含义?
34.    第118页:“int()也就是写0的另一种方式。”什么是“写0”?此处为何意?
35.    第130页:“void f(const Large& arg){} 如果没有显示地做类型转换,arg的值就不能修改”什么含义?
36.    第131页:“允许对const T&参数进行转换,就保证了对这种参数所能提供的值集合,正好与通过一个临时量传递T参数的集合相同。”什么含义?
37.    第133页:“如果要写的模板函数的返回类型是模板参数,就很可能需要用这种东西。”怎么理解这句话?
38.    第135页:第一段文字如何理解?
39.    第135页:“使用声明或者使用指令”,什么含义?
40.    第138页:“编译器是没办法知道这些情况的。。。将能通过编译”,怎么理解?为什么能通过编译?
41.    第139页:“itoa”的函数原型是什么?
42.    第139页:“指向函数的指针”,没看懂。
43.    第140页:SIG_TYP signal(int, SIG_ARG_TYP)是什么含义?没看懂。
44.    第145页:“混乱”,如何混乱了?
45.    第146页:“在考虑使用指向函数的指针时,请考虑虚函数或模板是不是更好的选择”,为什么要做此考虑?
46.    第150页:“函数expr()必须首先声明而后再定义,以便能打开在6.1.1节所说的依赖性循环”什么是依赖性循环,6.1.1节哪里说了?
47.    第154页:如何理解“全局性的使用指令是一种完成转变的工具,在其他方面最好避免使用。在一个名字空间里的使用指令是一种名字空间的组合工具。在一个函数里(也只在这种地方),可以安全地将使用指令作为一种方便的记法方式。”这段话如何理解?
48.    第156页:“事情很清楚,Parser_interface的用户仅仅依赖于Parser::expr(),而且是间接的。”什么叫间接的?
49.    第159页:using namespace $$$,其中$$$是这个名字空间定义所在的作用域里具有惟一性的名字。特别地,在不同编译单位里的无名名字空间也互不相同。什么是不同编译单位?如果不同,那么其它还有哪些无名名字空间?
50.    第159页:“名字空间本身必须在作用域里”,含义?什么作用域?
51.    第166页:“不能通过名字空间的别名去重新打开那个名字空间”,什么是别名?什么是重新打开?
52.    第168页:setjmp和longjmp的含义和作用?
53.    第173页:“在导致错误的代码的同一个抽象层次上处理错误是非常危险的。”什么叫导致错误的代码的同一个抽象层次?
54.    第173页:“利用异常去松弛‘错误’处理代码和正常处理代码之间的联系”;“采用用户定义类型作为异常,不用内部类型”;“当局部控制结构足以应付问题时,不要用异常”;怎么理解?
55.    第177页:“为什么在C语言中这个f()调用不是错误?”
56.    第178页:怎么理解“在C,C++程序里,关键字static也被用于表示“使用内部连接”。请不要使用static,除了在函数和类的内部。”?
57.    第180,182页,有关“单一定义规则ODR”的理解?
58.    第182页,“与非C++代码的连接”没看懂。
59.    第193页,“动态连接库与具有复杂依赖关系的全局变量也无法很好地共存”怎么理解?
60.    第193页,“将一段C++代码作为某个非C++程序的一部分去执行”,如何执行?
61.    第194页,“最大数目”和“最大限制”为何意?
62.    第194页,“在有意向用于非C++程序组成部分的代码中,应避免需要运行时初始化的非局部对象”,怎么理解?
...全文
482 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2016-12-28
  • 打赏
  • 举报
回复
第一个建议,每个问题拆成一个帖子。 第二个建议,善用wiki百科。
ForestDB 2016-12-28
  • 打赏
  • 举报
回复
1.    第5页:“标识符用的是比例宽度的字体”和“程序员已经习惯于采用等宽字体的代码”; 问题:“比例宽度”和“等宽字体”是什么含义? This 比例宽度 font. and this the second line.

This is 等宽字体 font.
and this the second line.
先看等宽字体,第一行的T和第二行的a是对其的,h和n对其,i和d对其; 但是在比例宽度字体中,每一列的字符并不是对齐的。
  • 打赏
  • 举报
回复
这本书不适合新手 适合有一定经验的专业程序员提高用的。
Dobzhansky 2016-12-28
  • 打赏
  • 举报
回复
这个帖子应该给100×10=1000分。我觉得。
GKatHere 2016-12-28
  • 打赏
  • 举报
回复
引用 8 楼 ipqtjmqj 的回复:
17. 第91页:“到函数的指针和到成员的指针都不能赋给void*” 问题:为什么? 17.首先这是规定,至于为什么,我个人理解:因为函数是只读的,到成员的指针指向的也是函数。
“到函数的指针和到成员的指针都不能赋给void*” 这句话没说完,前提是类, “到类的成员的指针不能赋给void” 因为到类的成员的指针不是指针,你可以将它看作偏移,最好还是看着一个结构,里面有各种信息以便解引用。

int f(){return 1;};
class A
{
public:
	int v;
	int f(){return 1;};
};
int main()
{
	void* f1 = f;	// OK 
	//f1 =&A::f;		// not OK

	auto offv = &A::v;
	auto offf = &A::f;
	
	cout << f1 <<endl;	
	cout << offv <<endl;	// 1
	cout << offf <<endl;	// 1

	printf("The End!");
	getchar();
	return 1;
}
GKatHere 2016-12-28
  • 打赏
  • 举报
回复
引用 8 楼 ipqtjmqj 的回复:
16. 第91页:“在那些为优化而使用的地方,可以将void*隐藏在类型安全的界面之后” 问题:什么是类型安全的界面? 16.原文说了见13.5,24.4.2,13.5节讲了在模板中使用void *, 24.4.2节讲的是接口, 反正意思就是尽量不要用void *, 除了13.5节与24.4.2节中提到的情况。 “类型安全的界面”中“界面”翻译得不好,应该是“接口”
我想,它指的是,void*指可以与其它类型指针相互转换,而没有warning吧,这样不能进行类型检查 不过“在那些为优化而使用的地方”这句话怪怪的

void f(void*){};
int* a;
char* b;
f(a);//OK
f(b);//OK
GKatHere 2016-12-28
  • 打赏
  • 举报
回复
14. 第83页:“在某些机器结构中,数组常常被分配在机器地址的边界上,所以‘数组开始元素之前的一个位置’根本就没有意义。”怎么理解? 这句话怪怪的。如果指越界的话,那么前越界后越界都没区别。
GKatHere 2016-12-27
  • 打赏
  • 举报
回复
52. 第168页:setjmp和longjmp的含义和作用? 手写吧。 他们用于 setjmp设置一个跳转点,然后longjmp跳转到此跳转点; 在设定跳转点的时候,全部相关变量(寄存器等)自动存储,然后到跳转后,自动弹出。
赵4老师 2016-12-26
  • 打赏
  • 举报
回复
这个帖子应该给100×10=1000分。我觉得。
aluow 2016-12-25
  • 打赏
  • 举报
回复
ipqtjmqj,真的是非常非常感谢您!!解答了不少的问题,期待您的进一步回复,非常感谢!!!!
ipqtjmqj 2016-12-25
  • 打赏
  • 举报
回复
43.就是一个函数原型,函数名叫signal,它有两个参数int与SIG_ARG_TYP, 其返回类型为SIG_TYP, 而SIG_TYP与SIG_ARGo_TYP是typedef而成的,因为直接写太长了。 44.就是如何有人写了#define arg_two x后会产生混乱,所以宏最好不要用,要用就大写。 45.因为虚函数与模板是C++新增的,作者当然要推销了 46.98页倒数第二段 47.就是完全引入一个名字空间中所有名字,最好不要用。 除非是像8.3.8节提到的组合: namespace My_lib{ using namespace His_string; using namespace Her_vector; void my_fct(String &); } 在一个函数就引入只能在函数中使用,所以不会产生冲突,是较安全的 48.间接地是因为expr的定义与使用在两个不同的命名空间,定义在Parse,使用在Parse_interface 49.比较一个程序有a.cpp与b.cpp组成,就有两个编译单位。这里的意思是无名名字空间在实现上,是一个有名的名字空间加上using namespace xxx。而具体的名字是不可见的。 50.作用域具体可上网搜索,参考http://en.cppreference.com/w/cpp/language/scope 51.名字空间别名书不就是写了在8.2.7节,重新打开,上方的代码例子就是重新打开。 52.setjmp, longjmp网上搜,有例子 53.待 54.待 55.因为C语言中如果发现调用的函数找不到声明,会假设其返回int类型,具体看附录B2.2节 56.static修改的变量或函数在连接时不可见,而C++引入了无名名字空间,就想当于使用static,所以不建议用。 57.就是避免重复,不用复制粘贴,只定义一次,就只需要在一个地方修改。如果在两个不同地方定义相同的类型或函数,其中一个改了一个没改,就会引起错误。 58.书中只举了也C代码的连接,很简单,函数声明加上extern "C"就可以了, C++中使用C的标准库就是这样实现的。 59.动态连接库你也可以理解为一个编译单位,不同编译单位中全局变量的初始化顺序是没有保证的,所以不同编译单位的全局变量之间不能有依赖。 60.windows下通过dll,linux通过so,不同编译型语言的代码,编译成二进制后格式是一样的,所以可以互相调用。 61.就是atexit能注册的函数数量是有限的 62.前面说了,全局变量初始化顺序在不同编译单位其顺序不保证,所以不能用在运行时才确定值的全局变量。
ipqtjmqj 2016-12-25
  • 打赏
  • 举报
回复
22-42题补充回答 22. 你前面没看吗,97页最后一行就有定义。false是参数,具体作用自己看函数定义。 23.文中后面说了,不能算cheat,标准库就是给人用的。 24. 2.5.2是第2章第5节,在2.5.2讲用户自定义类型,整个第11章讲运算符重载。 25. 类似于int a; sizeof(a), sizeof(int),效果是一样的,但参数不同,一个是直接填类型,另一个是具体的变量 26. sizeof, 逻辑非!, 按位取反~, 这些C语言就有,你没学C语言就看C++? 27. 就是把自定义的重载new运算符的参数提前放置 class my_type{}; void *operator new(size_t sz, double a){} int main() { my_type *p = new(1.1) my_type; return 0; } 28.就是横线分隔的一格,有些格里面有几个运算符,它们有相同的优先级 32.只是举例,说明通过异或比较是常见的,具体我也不懂。 33.就是说了几种隐式类型转换的情况,以及具体在本书出现的地方。 35.因为是引用,是外部的值,并且是const修饰的,所以不能修改 36.就是允许将临时值(右值)传递给const引用,这样避免了复制 38.意思就是1.重载简化函数名字2.没有重载时,编译器会试图将参数转换类型,有时候正好可以转换,这就不会报错(可能报warning,取决于编译器设置),书的的4个例子错误使用的有3个,但只有1个编译器会报错。 40.因为参数是变长的,所以就没有参数检查,所以能通过编译。 而具体需要什么参数,与printf实现有关,而实现是看不到的,编译器只看接口(函数声明),接口正确就编译通过。 事实上printf函数与用户使用的代码是分别编译的,最后才连接成可执行文件,所以printf具体规定的%d后面需要一个int型参数这些编译器是没法得知的。
ipqtjmqj 2016-12-25
  • 打赏
  • 举报
回复
1-21题补充回答 5.类型域就是一个类的成员变量,用来表示什么类型,比如 class fruit { protected: std::string type; }; class apple: public fruit { public: apple(){type = "apple";} }; 这样表示,因为有虚函数,所以没有必要。、 7.“集”原文是set 10.隐式转换,可以由unsigned short变成signed long, 这样无符号变有符号了 具体看附录C6.1,6.2 16.原文说了见13.5,24.4.2,13.5节讲了在模板中使用void *, 24.4.2节讲的是接口, 反正意思就是尽量不要用void *, 除了13.5节与24.4.2节中提到的情况。 “类型安全的界面”中“界面”翻译得不好,应该是“接口” 17.首先这是规定,至于为什么,我个人理解:因为函数是只读的,到成员的指针指向的也是函数。 18.可以理解为“任意地” 20.Token_value是枚举,而4.8节正是讲枚举 21.确实没有,只是说说而已,并且作为6.6节的第19题
GKatHere 2016-12-25
  • 打赏
  • 举报
回复
7. 第23页:“一集相关的过程与被它们所操作的数据组织在一起,通常被称做一个模块。” 问题:“一集”是什么含义? 原文也许是 set 吧
GKatHere 2016-12-25
  • 打赏
  • 举报
回复
6. 第19页:“……写出好程序的一种范型”中的“范型”; 问题:“范型”与“泛型”的含义和区别? 补充下: 范型: 如模式(比如工厂); 泛型 如STL(比如vector)
GKatHere 2016-12-25
  • 打赏
  • 举报
回复
5. 第16页:“不要在一个类里面放‘类型域’;采用虚函数。” 问题:什么是类型域? 类型域可用enum来解释,它指继承本类的 对象是什么类型。 例:

class A{ 
enum TYPE{a, b, c}; 
TYPE t;     // 不要有此
TYPE gett(){return t;};   //也不要有此
virtual  TYPE gett() =0;     //使用此
}
class B :public A
{
 B(){ A::t == A::b;};   // 如果有类型域,由B设A::t
TYPE  TYPE gett() {return A::b;};     //使用此
}

lsfv001 2016-12-25
  • 打赏
  • 举报
回复
待, 少年好体力。。。。
ipqtjmqj 2016-12-23
  • 打赏
  • 举报
回复
22.待 23.待 24.待 25.待 26.待 27.待 28.待 29.说的是x++的返回值,返回的是x的一个拷贝,然后x加1了。 30.逗号操作符,其值为最后一个操作数的值,如(1,2,3,4,5)其值为5 31.合法是因为编译通得过,胡言是可能原来的意思是max >= i && max < i 32.待 33.待 34.默认构造填充0 35.待 36.待 37.比如定义一个求最大值的模块template<typename T> T max(T v1, T v2){},返回值T是模板参数 38.我没看过书也没书,待考证 39.using std::endl;叫声明. using namespace std;叫指令(directive) 40.待联系上下文,通过编译并不意味着运行时没错 41.itoa不是标准的函数,具体你网上查一查就有了 42.函数与数组一样,传递时会隐式转换成指针。 函数一般由好几句语句组成,编译成汇编又有好多句,每句汇编对应一个固定的等长的值,比如32位的,每句存储时就占4个字节,这就和数组类型,为了效率,故只复制其首地址。 函数的参数个数,参数类型,返回值类型不同,所以函数也有类型,函数指针也有不同类型,如标准库中的qsort,就需要一个类型为int (*)(void *, void *)的函数指针,用作比较。
ipqtjmqj 2016-12-23
  • 打赏
  • 举报
回复
1.等宽字体故名思义就是宽度一样的字体,像汉字都是宽度固定的,但英文字母通过宽度不固定,如W,M这些字母通常比较宽,i,l就比较窄,但这属于字体设计问题,也可以将字体设计成等宽的,常用的等宽字体有courier,consolas 2.静态语言就是经过编译的语言,如Pascal, Java。动态语言就是不用编译写好直接运行,又叫解释型语言,如Javascript, Python. 3.就是extern "C", 然后不能有类,具体见http://www.stroustrup.com/bs_faq2.html#callCpp 4.有向无环图故名思义,首先是一个图(图可以理解为一个网), 然后是有向的(对应还有无向图), 然后是无环的(对应还有有环的), 把程序比作类的有向无环图,表示类之间可以互相调用(有向),并且不能死循环(无环); 术语来自《数据结构》 5.待 6.范型paradigm, 泛型generic; 范型指编程方式,如面向过程,面向对象。 泛型是一个编程方式。 7.翻译问题,不用纠结。 8.ISO-646是ISO(Internation Standard Organization)国际标准化组织的一个标准,具体参考https://en.wikipedia.org/wiki/ISO/IEC_646,我也第一次听说,不用纠结,反正字符集最通用的是ASCII, ASCII是7位的,现在通常是8位的,最高位为0,其他字符则通过最高位为1来防止与ASCII冲突,如汉字编码GB2312,还有UTF-8也是兼容ASCII的。 9.L修饰字符串,字符串就变成宽字符,宽字符具体用什么编译标准没规定,但通过是UTF-16LE, UTF-16LE中每个字符都用两个字节表示,所以不兼容ASCII, 而且两个字节也不够表示所有字,超出部分是用四个字节表示的。 10.待 11.因为sizeof(int) == 4, 所以不会是8. == 4是把枚举当作整数型一样。 == 1是当作字节。 标准没规定故由编译器决定 12.很容易是只需要加一句typedef, 如果不用int32而用int, 则需要把所有int而成long, 很不容易。 13.程序的存储分成几个区,一些区专门存程序,一些区存常数,常用的区有bss(全局变量但没初值), data(全局变量), text(程序). 由编译器是因为标准没有规定,比较笨的编译器可能是分开存的,聪明一点的放在一起。 14.内存对齐,为了cpu执行效率,比如字长4字节的,首地址是被4整除的。 15.限制就是const限制,值是常量,不能改变的限制,实际上是可以改变的 16.待 17.待 18.待 19.@只是为了说明而用的符号,@的值可以是+,-,*,/,%,<<,>>,|,&,^等。 20.待 21.待

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧