C语言编程:常见错误与调试技巧

1 下载量 184 浏览量 更新于2024-08-04 收藏 826KB PPT 举报
"C程序设计第三版常见错误分析和调试技巧" C语言编程中,程序员常常会遇到各种错误,这些错误可能会导致程序无法正确运行或编译失败。本资源主要聚焦于C程序设计第三版中常见的错误类型,并提供相应的错误分析和解决策略。 14.1 常见错误分析: - **忘记定义变量**:在使用变量之前,必须先声明并定义它,否则编译器将无法识别。 - **数据类型与格式说明符不一致**:在输入输出操作中,如printf和scanf,确保数据类型与格式化字符串匹配,例如,整数用%d,浮点数用%f等。 - **整型数据范围**:了解并注意int类型数据的最小和最大值,超出范围会导致数据溢出。 - **使用变量地址符**:在使用scanf进行输入时,对于需要修改的变量,需传递其地址,如`scanf("%d", &num)`。 - **输入数据格式不符**:确保输入的数据符合预期格式,比如整数、浮点数或字符串。 - **误用“=”为赋值运算符**:应区分“=”(赋值运算符)和“==”(相等比较运算符)。 - **遗漏分号**:每个语句结尾通常需要分号,缺少它可能导致语法错误。 - **不当加分号**:某些情况下,如if、for、while语句后的分号会导致逻辑错误。 - **忘记添加花括号**:复合语句需要花括号包围,否则只有一条语句会被视为该语句块的一部分。 - **括号不配对**:正确匹配括号是至关重要的,否则会导致编译错误或逻辑混乱。 - **大小写混淆**:C语言是区分大小写的,标识符的大小写必须保持一致。 - **数组元素引用**:使用数组时,正确使用方括号[],而非圆括号()。 - **数组定义和使用**:理解数组的索引是从0开始的,数组定义的大小不等于最大可访问下标。 - **二维数组处理**:正确定义和引用多维数组,尤其要注意行和列的维度。 - **数组名与元素的误解**:数组名代表数组的首地址,不是所有元素的集合。 - **字符数组与指针**:字符数组是存储字符的数组,而字符指针是指向字符的指针,它们在处理字符串时有所不同。 - **未初始化的指针**:使用指针前确保已为其分配了正确的值或地址。 - **switch语句的break**:每个case分支末尾通常需要break,以防止流程意外跳转到下一个分支。 - **字符与字符串**:字符由单引号包围,字符串用双引号,注意它们的表示和处理方式。 - **自增自减运算符**:理解自增和自减运算符的前置和后置区别,以及它们在表达式中的作用。 14.2 程序调试: - **函数声明与定义的匹配**:确保函数声明的参数类型和数量与定义一致,否则可能导致链接错误。 - **函数定义顺序**:函数定义应在调用之前,或至少在调用前声明,否则编译器无法找到函数定义。 - **包含头文件**:使用库函数或类型时,通过`#include`指令引入对应的头文件。 - **形参与实参的关联**:形参是函数内部的临时变量,实参的变化不会影响形参,除非通过指针传递。 - **类型匹配**:确保函数调用时的实参类型与函数声明的形参类型一致。 - **不同类型的指针混合使用**:避免将不同类型的指针用于同一操作,可能导致类型不匹配的错误。 - **参数求值顺序**:不要依赖参数的求值顺序,因为这在不同的编译器或优化级别下可能不同。 - **数组名与指针**:数组名实际上是一个指向数组首元素的指针,但它们在内存管理上有本质区别,不能混淆。 - **结构体类型与变量**:结构体类型是用来定义变量的模板,直接对类型赋值是错误的,应创建结构体变量并赋值。 通过理解并避免这些常见错误,可以显著提高C语言编程的效率和代码质量。熟练掌握错误分析和调试技巧是成为一名优秀C程序员的关键步骤。在实践中,不断学习和总结错误,能帮助我们编写更健壮、更可靠的代码。

SELECT PIS.SHOW_FLT_DETAIL AS SHOW_FLT_DETAIL -- new , PIS.SHOW_AWB_DETAIL AS SHOW_AWB_DETAIL -- new , PIS.DISPLAY_AIRLINE_CODE AS CARRIER_CODE , DECODE(PIS.REVERT_FLOW,'N',PIS.FLOW_TYPE,DECODE(PIS.FLOW_TYPE,'I','E','I')) AS FLOW_TYPE , PIS.SHIP_TO_LOCATION AS SHIP_TO_LOCATION , PIS.INVOICE_SEQUENCE AS INVOICE_SEQUENCE , PFT.FLIGHT_DATE AS FLIGHT_DATE , PFT.FLIGHT_CARRIER_CODE AS FLIGHT_CARRIER_CODE , PFT.FLIGHT_SERIAL_NUMBER AS FLIGHT_SERIAL_NUMBER , PFT.FLOW_TYPE AS AIRCRAFT_FLOW , FAST.AIRCRAFT_SERVICE_TYPE AS AIRCRAFT_SERVICE_TYPE , PPT.AWB_NUMBER AS AWB_NUMBER , PPT.WEIGHT AS WEIGHT , PPT.CARGO_HANDLING_OPERATOR AS CARGO_HANDLING_OPERATOR , PPT.SHIPMENT_PACKING_TYPE AS SHIPMENT_PACKING_TYPE , PPT.SHIPMENT_FLOW_TYPE AS SHIPMENT_FLOW_TYPE , PPT.SHIPMENT_BUILD_TYPE AS SHIPMENT_BUILD_TYPE , PPT.SHIPMENT_CARGO_TYPE AS SHIPMENT_CARGO_TYPE , PPT.REVENUE_TYPE AS REVENUE_TYPE , PFT.JV_FLIGHT_CARRIER_CODE AS JV_FLIGHT_CARRIER_CODE , PPT.PORT_TONNAGE_UID AS PORT_TONNAGE_UID , PPT.AWB_UID AS AWB_UID , PIS.INVOICE_SEPARATION_UID AS INVOICE_SEPARATION_UID , PFT.FLIGHT_TONNAGE_UID AS FLIGHT_TONNAGE_UID FROM PN_FLT_TONNAGES PFT , FZ_AIRLINES FA , PN_TONNAGE_FLT_PORTS PTFP , PN_PORT_TONNAGES PPT , FF_AIRCRAFT_SERVICE_TYPES FAST , SR_PN_INVOICE_SEPARATIONS PIS --new , SR_PN_INVOICE_SEP_DETAILS PISD--new , SR_PN_INV_SEP_PORT_TONNAGES PISPT --new WHERE PFT.FLIGHT_OPERATION_DATE >= trunc( CASE :rundate WHEN TO_DATE('01/01/1900', 'DD/MM/YYYY') THEN ADD_MONTHS(SYSDATE,-1) ELSE ADD_MONTHS(:rundate,-1) END, 'MON') AND PFT.FLIGHT_OPERATION_DATE < trunc( CASE :rundate WHEN TO_DATE('01/01/1900', 'DD/MM/YYYY') THEN TRUNC(SYSDATE) ELSE TRUNC(:rundate) END, 'MON') AND PFT.TYPE IN ('C', 'F') AND PFT.RECORD_TYPE = 'M' AND (PFT.TERMINAL_OPERATOR NOT IN ('X', 'A') OR (PFT.TERMINAL_OPERATOR <> 'X' AND FA.CARRIER_CODE IN (SELECT * FROM SPECIAL_HANDLING_AIRLINE) AND PPT.REVENUE_TYPE IN (SELECT * FROM SPECIAL_REVENUE_TYPE) AND PPT.SHIPMENT_FLOW_TYPE IN (SELECT * FROM SPECIAL_SHIPMENT_FLOW_TYPE) AND PFT.FLIGHT_OPERATION_DATE >= (select EFF_DATE from SPECIAL_HANDLING_EFF_DATE) )) AND PFT.DELETING_DATETIME IS NULL AND FA.AIRLINE_UID = PFT.AIRLINE_UID AND FA.DELETING_DATETIME IS NULL AND PTFP.FLIGHT_TONNAGE_UID = PFT.FLIGHT_TONNAGE_UID AND PTFP.RECORD_TYPE = 'M' AND PTFP.DELETING_DATETIME IS NULL AND PPT.TONNAGE_FLIGHT_PORT_UID (+)= PTFP.TONNAGE_FLIGHT_PORT_UID AND PPT.RECORD_TYPE (+)= 'M' AND PPT.DISCREPANCY_TYPE (+)= 'NONE' AND PPT.ADJUSTMENT_INC_FLAG (+)= 'Y' AND PPT.DELETING_DATETIME (+) IS NULL AND FAST.AIRCRAFT_SERVICE_TYPE_UID = PFT.AIRCRAFT_SERVICE_TYPE_UID AND FAST.DELETING_DATETIME IS NULL AND PIS.TEMPORAL_NAME = TO_CHAR((CASE :rundate --new WHEN TO_DATE('01/01/1900', 'DD/MM/YYYY') THEN TRUNC(SYSDATE) ELSE TRUNC(:rundate) END ), 'YYYYMM') || '00' AND PIS.INVOICE_SEPARATION_UID = PISD.INVOICE_SEPARATION_UID --new AND PISD.INVOICE_SEP_DETAIL_UID = PISPT.INVOICE_SEP_DETAIL_UID --new AND PISPT.PORT_TONNAGE_UID = PPT.PORT_TONNAGE_UID --new AND PIS.PRINT_SUPPORTING_DOC = 'Y';上面是oracle的写法,请转成spark SQL的写法。

2023-06-02 上传