我已經用不同的方式多次撰寫了這個程式,但我沒有得到輸出,也無法找出錯誤,有沒有人可以指出這個程式中的邏輯錯誤?
#include<stdio.h>
#include<string.h>
int main()
{
float temp;
char c[15];
printf("Enter temperature in F degree=");
scanf("%f",&temp);
c = (temp>=80 ? strcpy(c,"swimming"):
(60<=temp<80 ? strcpy(c,"tennis"):
(40<=temp<60 ? strcpy(c,"Golf"):
strcpy(c,"skiing 1."))));
printf("%s",c);
}
uj5u.com熱心網友回復:
您不能將任何內容分配給c. C 中的陣列衰減為指向其第一個元素的指標。這也適用于運算=符的左運算元。而這樣的指標不是 L 值。它是一個臨時的計算結果,如1 1、foo(1)、&c或(int)c。
R 值不指定物件,因此無法分配。
從6.3.2.1p3 開始:
除非它是 sizeof 運算子、_Alignof 運算子或一元 & 運算子的運算元,或者是用于初始化陣列的字串文字,否則型別為“array of type”的運算式將轉換為帶有type ''pointer to type'' 指向陣列物件的初始元素,而不是左值。如果陣列物件具有暫存器存盤類,則行為未定義。
uj5u.com熱心網友回復:
陣列沒有賦值運算子。它們是不可修改的左值。
來自 C 標準(6.3.2.1 左值、陣列和函式指示符)
- ...一個可修改的左值是一個左值,它沒有陣列型別,沒有不完整的型別,沒有一個 const 限定型別,如果它是一個結構或聯合,沒有任何成員(包括,遞回,所有包含的聚合或聯合的任何成員或元素)具有 const 限定型別。
所以代替這個賦值陳述句
c = (temp>=80 ? strcpy(c,"swimming"):
(60<=temp<80 ? strcpy(c,"tennis"):
(40<=temp<60 ? strcpy(c,"Golf"):
strcpy(c,"skiing 1."))));
如果您使用了錯誤的邏輯運算式,例如60<=temp<80(始終計算為邏輯真,因為子運算式60 <= temp計算為整數0或1在任何情況下都小于80),您應該撰寫
(temp>=80 ? strcpy(c,"swimming"):
(60<=temp && temp <80 ? strcpy(c,"tennis"):
(40<=temp && temp <60 ? strcpy(c,"Golf"):
strcpy(c,"skiing 1."))));
盡管為了可讀性,最好使用 if-else 陳述句來重寫此陳述句,例如
if ( temp>=80 )
{
strcpy(c,"swimming");
}
else if ( temp >= 60 )
{
strcpy(c,"tennis");
}
else if ( temp >= 40 )
{
strcpy(c,"Golf");
}
else
{
strcpy(c,"skiing 1.");
}
uj5u.com熱心網友回復:
將strcpy(即char *)的回傳值分配給您的變數c(即 char 陣列)是非法的 C 代碼。
在每個塊中if ... else if ... else if ... else ...使用一個簡單的strcpy將是更好的解決方案。
如果你真的想要一個單一的代碼行,你可以把三元的東西放在里面strcpy:
strcpy(c, temp >= 80 ? "swimming" :
temp >= 60 ? "tennis" :
temp >= 40 ? "Golf" :
"skiing 1.");
注意:在第二部分中,檢查temp >= 60. 您不需要 ,temp < 80因為由于先前的temp >= 80條件,這已經是正確的。
uj5u.com熱心網友回復:
您可以分配指標,但不能分配陣列。主要的混淆是陣列衰減為運算式中的指標。但是指標和陣列是完全不同的。
如果要分配使用指標。
這里的另一個問題是邏輯運算式。
60<=temp<80始終為真,因為它等價于(60<=temp)<80。
(60<=temp)將導致1or0并且這些值始終低于80
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
float temp;
char *c=malloc(15);
printf("Enter temperature in F degree=");
scanf("%f",&temp);
c = (temp>=80 ? strcpy(c,"swimming"):
(60<=temp && temp <80 ? strcpy(c,"tennis"):
(40<=temp && temp <60 ? strcpy(c,"Golf"):
strcpy(c,"skiing 1."))));
printf("%s",c);
}
uj5u.com熱心網友回復:
單擊此處獲取代碼您不能為字串函式回傳的字符陣列賦值。此字串函式將值回傳到字串函式中提供的目標字符陣列
但是您可以通過這種方式使用三元運算子 ->> 洗掉這部分 (c =)。并且還將這部分從 (40<temp<60 ) 更改為 (temp<40 && temp>60) 的所有代碼部分,其中你寫了這個。只需撰寫您想要執行的三元運算,然后您的代碼就可以作業了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/335925.html
