-1

我已经以不同的方式多次编写了这个程序,但我没有得到输出并且无法找出错误,有没有人可以指出这个程序中的逻辑错误?

#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);
}
4

5 回答 5

4

您不能将任何内容分配给c. C 中的数组衰减为指向其第一个元素的指针。这也发生在运算符的左操作数上=。而且这样的指针不是 L 值。它是计算的临时结果,例如1+1,或。foo(1)&c(int)c

R 值不指定对象,因此无法分配它们。

6.3.2.1p3 开始

除非它是 sizeof 运算符、_Alignof 运算符或一元 & 运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为 ''array of type'' 的表达式将转换为具有type ''pointer to type'' 指向数组对象的初始元素并且不是左值。如果数组对象具有寄存器存储类,则行为未定义。

于 2021-10-22T13:00:58.763 回答
3

数组没有赋值运算符。它们是不可修改的左值。

来自 C 标准(6.3.2.1 左值、数组和函数指示符)

  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计算结果为整数01在任何情况下小于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.");
} 
于 2021-10-22T13:03:08.940 回答
2

strcpy将(which is )的返回值分配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条件,您不需要因为这已经是真的。

于 2021-10-22T13:20:54.267 回答
0

您可以分配指针,但不能分配数组。主要的困惑是数组衰减为表达式中的指针。但是指针和数组是完全不同的。

如果要分配使用指针。

这里的另一个问题是逻辑表达式。

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);
}
于 2021-10-22T13:08:41.940 回答
0

单击此处获取代码您不能为字符串函数返回的字符数组赋值。此字符串函数将值返回到字符串函数中提供的目标字符数组

但是您可以以这种方式使用三元运算符 ->> 删除这部分 (c =)。并在所有代码部分中将此部分从 (40<temp<60) 更改为 (temp<40 && temp>60)你写了这个。只需编写您要执行的三元运算,您的代码就可以工作。

于 2021-10-22T13:50:46.190 回答