user-0 提问: 问一个关于大于和小于符号的简单问题

回复:
user: user-1
content: a > b 好，还是 b < a 好？ 首先应该明确一下，什么是“好”。我能想到的，可以从两个方面考虑： 一、从程序执行速度角度出发，速度越快越好。     那，哪种写法运行速度更快呢？这得看a,b是什么数据类型。 	1. a,b都是内置类型，比如 int a,b; 	    这种情况下，几乎没区别，除了使用的CPU指令不同以外。当然这得看编译器如何使用内存、寄存器以及CPU指令。 	2. a,b是自定义类型，比如 struct Point2D{int x,y;} a,b; 		这种情况，不同于内置类型的比较。在C++中，可以通过重载运算符实现对自定义类型对象的比较。 //以下代码定义Point2D这种类型，并且支持<,>,==3种比较运算符： #include <cassert> struct Point2D { 	int x,y; 	bool operator< (const Point2D& p)const{ 		return (x + y) < (p.x + p.y); 	} 	bool operator> (const Point2D& p)const{ 		return p < *this; 	} 	bool operator== (const Point2D& p)const{ 		return !(p < *this) && !(*this < p); 	} }; int main(){ 	Point2D a,b; 	a.x = 1, a.y = 1; 	b.x = 2, b.y = 2; 	assert(a < b); 	assert(b > a); 	assert(!(a==b)); 	return 0; } 		在上例代码中，大于(>)和等于(==)操作是通过重用小于(<)的操作实现的，这也是惯用手法。如果要修改比较的定义，只需要修改operator<中的比较就能自动应用于大于和等于中了。 		在这个实现中来说a<b和b>a哪个速度快的话，是比较明显的。a<b要比b>a快，因为大于操作是通过函数调用小于操作实现的，相比直接用小于操作，多了函数调用产生的时间开销，自然运行时间较长。 		这也是STL库中随处可见用 a<b 代替 b>a 的写法，因为STL中的模板算法不知道具体参与比较是对象是内置类型还是自定义类型。 二、从程序员阅读代码的角度出发，越符合逻辑越好。 	是否符合逻辑就是一个不确定因素了。有人喜欢说“我的年纪比你大”，也有人喜欢说“你的年纪比我小”，我不讨论这种情况的好坏。如果写代码的人和读代码的人是同一类型，那就是好的！

user: user-2
content: 引用 11 楼 baidu_37097818 的回复:反对类似于if(nullptr == p)的写法。 这与阅读习惯背道而驰，看似能避免意外赋值，实则违反人的天性，而且，对于重载了operator==的类来说，这种写法可能就是错的。例如我写了一个类A，判断它与string是否相等，可以这样写a == str, 但写成str == a就是错的，因为std::string并没有重载operator==(A) friend bool operator==(const string& str,const A& rhs)

user: user-3
content: 反对类似于if(nullptr == p)的写法。 这与阅读习惯背道而驰，看似能避免意外赋值，实则违反人的天性，而且，对于重载了operator==的类来说，这种写法可能就是错的。例如我写了一个类A，判断它与string是否相等，可以这样写a == str, 但写成str == a就是错的，因为std::string并没有重载operator==(A)

user: user-4
content: 可以看看编程规范方面的书，最近在看c专家编程

user: user-5
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-6
content: for(i=0;i<m;i++){ 你会写成 for(i=0;m>i;i++) 吗？  由于LZ给的代码片段很少， for(i=0;i<m;i++){     for(j=0;j<n;j++){ 所以我只能断章取义的说，a[i] < a[j]要好些。  具体的原因，就是在 for(i=0;i<m;i++){ 中i是主语，所以i怎么怎么样，这样思维比较连贯；改成m > i，宾语变主语了，人称不一致了，先是我怎么怎么样，然后它怎么怎么样，然后又是我怎么怎么样。  而对于 for(i=0;i<m;i++){     for(j=0;j<n;j++){ 由于i是外层索引，j是内层索引，所以在没有别的上下文的情况下，我当然会觉得i比j怎样会自然些。  要点：读的人觉得自然就好。

user: user-5
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。  http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-7
content: 这个应该没有硬性要求，因为判断的结果不变，不影响程序的编译，更不影响运行。  但对于等于判断，对于初学者或者刚接触编程语言来讲，可能会经常将等于判断写成赋值表达式。为了，减少出错率。一般会将等于判断表达式的两边调换位置。比如指针变量判断是否为NULL，可以写成  int *p; if (p == NULL)    /*很容易写成if (p = NULL)*/  如果写成如下形式就好，即将p和NULL交换位置 if (NULL == p) 即使错误写成 if (NULL = p)也没关系，因为编译器会提示你错误； 但是如果写成 if (p = NULL)编译器是不会提示错误的。

user: user-8
content: 经验规则：便于理解，方便交流，符合正常的思维习惯，重要的表达式写在左边。

user: user-9
content: 看情况吧 有要求的话按要求  自己编程随意吧

user: user-5
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-10
content: 引用 5 楼 prayer163 的回复:肇事老师你看下这个吧，一道考试题，答案是a[i]<a[j]，如果我写了a[j]>a[i] 是不是算我错? 肇事老师

user: user-0
content: 肇事老师你看下这个吧，一道考试题，答案是a[i]<a[j]，如果我写了a[j]>a[i] 是不是算我错?