做网站配置好了找不到服务器,技术支持 东莞网站建设电脑回收,外贸网络营销是做什么的,做网站后台系统的规范对于图1中的程序其中存在一个问题#xff0c;那就是38行if语句中的判断条件#xff0c;这一程序的结果是只有else语句中的程序会被执行。其中的错误在于#xff0c;if语句中本应是“”#xff0c;但却被误写成了“”#xff0c;因而_p_ref中的prev_被斌值成了零#xff0… 对于图1中的程序其中存在一个问题那就是38行if语句中的判断条件这一程序的结果是只有else语句中的程序会被执行。其中的错误在于if语句中本应是“”但却被误写成了“”因而_p_ref中的prev_被斌值成了零接着if语句判断其是否为true由于零被当作是false所以永远只有else语句中的程序会被执行。dll.c00036: void dll_insert_before (dll_t *_p_dll, dll_node_t *_p_ref, dll_node_t *_p_inserted)00037: {00038: if (_p_ref-prev_ 0) {00039: _p_dll-head_ _p_inserted;00040: _p_ref-prev_ _p_inserted;00041: _p_inserted-next_ _p_ref;00042: _p_inserted-prev_ 0;00043: }00044: else {00045: _p_ref-prev_-next_ _p_inserted;00046: _p_inserted-prev_ _p_ref-prev_;00047: _p_inserted-next_ _p_ref;00048: _p_ref-prev_ _p_inserted;00049: }00050: _p_dll-count_;00051: }图1类似这种错误有可能造成很大的问题如何通过编程习惯去避免它呢方法就是养成将常量放在“”前面的习惯如图2中的38行所示。一旦“”被误写成了“”的话由于常量零是不能用做左值的因此编译器就能帮助发现这一失误。显然当“”两边的都是变量时如果出现失误还是不能被发现。dll.c00036: void dll_insert_before (dll_t *_p_dll, dll_node_t *_p_ref, dll_node_t *_p_inserted)00037: {00038: if (0 _p_ref-prev_) {00039: _p_dll-head_ _p_inserted;00040: _p_ref-prev_ _p_inserted;00041: _p_inserted-next_ _p_ref;00042: _p_inserted-prev_ 0;00043: }00044: else {00045: _p_ref-prev_-next_ _p_inserted;00046: _p_inserted-prev_ _p_ref-prev_;00047: _p_inserted-next_ _p_ref;00048: _p_ref-prev_ _p_inserted;00049: }00050: _p_dll-count_;00051: }图2如果做进一步思考的话能否通过禁止在if的判断条件语句使用“”来彻底杜绝这类问题呢当然要做到这一步这需要改变编译器的行为进一步还得更改C/C语言的规范这是个不小的动作。在某些情况下为了简化程序书写会故意在if的判断条件语句中使用“”但现在看来这种灵活性还是让我们付出了代价。这就是C/C语言并不严谨的语法带给了我们一定的灵活性当然也给我们带来了“意外”。这类灵活性我们真的需要吗除了if语句可以使用这一编程习惯图3示例了另一种情形。example.c00054: stack_size (0 stack_size) ? STACK_DEFAULT : stack_size;图3 转载于:https://blog.51cto.com/yunli/264516