c語言踩坑總結

I_T_Dark發表於2018-12-20

運算子優先順序引發的問題:

先來看兩行程式碼:  ?:與 = 運算子的優先順序


    while (*pp != '\0')*pp != ' ' && !flag ? num++, flag = 1, pp++ : pp++, flag = 0;
    while (*pp != '\0')*pp != ' ' && !flag ? num++, flag = 1, pp++ : flag = 0, pp++;
//這兩行程式碼下面一行會報錯:表示式必須是可修改的左值

不同之處僅僅在於exp1?exp2:xep3中exp3中的兩句交換了個位置而已?:運算子的優先順序要高於=運算子,所以第二句會被編譯器理解為:    while (*pp != '\0')(*pp != ' ' && !flag ? num++, flag = 1, pp++ : flag) = 0, pp++;

解決辦法:在 ? 和 : 的中間加一個括號,在 : 和 ; 中間也加一個括號

while (*pp != '\0')*pp != ' ' && !flag ? num++, flag = 1, pp++ :( flag = 0, pp++);

if else的巢狀問題:

最近在寫大整數表示式運算的時候出現了一堆bug,改了又改,不過感覺比較難發現的還是這個if else 的巢狀

static char *B_Caculator(char a[], char b[], char method, char result[])
{
	//char result[100000];
	switch (method)
	{
	case '+':
		if (a[0] == b[0] && a[0] == '-') {
			BigIntegerAdd(&a[1], &b[1], result);
			BigIntegerResultReverse(result);
			result[strlen(result) + 1] = '\0';
			result[strlen(result)] = '-';
			BigIntegerResultReverse(result);
		}
		if(a[0]=='-'&&b[0]!='-')BigIntegerSub(b, &a[1], result);
		if (b[0] == '-'&&a[0] != '-')BigIntegerSub(a, &b[1], result);
		else BigIntegerAdd(a, b, result);
		break;
	case '-':

這是一段程式碼,分別對兩個負數相加兩個正數相加一正一負相加作了判斷  現假設a="-123",b="123",則它不滿足第一種兩個都是負數的情況,但滿足第二種情況,所以執行了BigIntegerSub(b, &a[1], result);執行完畢後又來判斷第三種情況(既a為負b為正的情況)不滿足,這時候又執行了最後一個else BigIntegerAdd(a, b, result);這就導致了錯誤,原本想要的是在都不滿足所有列出的情況的時候才執行最後一條else語句,但現在的情況其實是隻要第三個if語句的條件不滿足就會執行else語句,解決方法就是在每個if語句執行完後加個break,或者寫成if{}else if{}else if{}else{}的形式

static char *B_Caculator(char a[], char b[], char method, char result[])
{
	//char result[100000];
	switch (method)
	{
	case '+':
		if (a[0] == b[0] && a[0] == '-') {
			BigIntegerAdd(&a[1], &b[1], result);
			BigIntegerResultReverse(result);
			result[strlen(result) + 1] = '\0';
			result[strlen(result)] = '-';
			BigIntegerResultReverse(result);
		}
		else if(a[0]=='-'&&b[0]!='-')BigIntegerSub(b, &a[1], result);
		else if (b[0] == '-'&&a[0] != '-')BigIntegerSub(a, &b[1], result);
		else BigIntegerAdd(a, b, result);
		break;
	case '-':

 

相關文章