exit(1); }
return (result * flag); }
int main(void) {
printf(\ printf(\ printf(\ printf(\ } 此函数中
1. 首先通过断言assert判断对myatoi()的调用是否合法; 2. 判断字符串开头是否有空格或制表符(TAB),有则跳过; 3. 若字符串第一个有效字符为’-‘,则flag置-1,若为’+’,则flag置1,若为其他字符,则判断此字符串为非数字字符串,result的最终值为0; 4. 将字符类型的数字转换成int类型的数字,
5. 判断result是否越界,若越界,跳出程序,否则返回result*flag的值;
这道题主要考的是程序员的编程风格,虽说这个函数看上去很简单,但如果要考虑到程序的健壮性,正确定,可靠性,效率,易用性,可扩展性,可移植性等属性的话,程序编写起来就不简单了;
四. 含参数的宏与函数的优缺点
无参的宏就用得多了,但带参数的宏呢?见过很多,但真正自己去编的几乎没有,今天,顺带把这个问题也搞清楚。 含参数的宏优点:
省去了函数调用的开销,运行效率高. 含参数的缺点:
由于宏本质上是字符串的替换,所有可能会由于一些参数的副作用导致得出 错误的结果. 如:
#define max(a, b) ( ((a) > (b)) ? (a) : (b) ) 如果程序中出现这样的调用: max(a++, b);
将导致a被计算2次,从而可能得到错误的结果,而函数调用不会出现这种问题. 另外,如果程序中有多次宏替换的话,可能导致代码体积变大. 函数调用的优点:
没有带参数宏可能导致的副作用,计算的正确性较宏更有保证. 函数调用的缺点:
函数调用需要一些参数,返回地址等入栈,出栈的开销,效率没有带参数的宏高.
局部变量全局变量静态局部变量静态全局变量的异同



