关于运算符:F =(9/5 * C)+ 32和F =(C * 9/5)+ 32有什么区别? 优先?

您所在的位置:网站首页 ℃和f的区别 关于运算符:F =(9/5 * C)+ 32和F =(C * 9/5)+ 32有什么区别? 优先?

关于运算符:F =(9/5 * C)+ 32和F =(C * 9/5)+ 32有什么区别? 优先?

2024-07-16 13:55| 来源: 网络整理| 查看: 265

本问题已经有最佳答案,请猛点这里访问。

尽管C的输入相同,但F =(C * 9/5)+ 32和F =(9/5 * C)+ 32会产生两个不同的结果。 我意识到运算符中存在某种优先级,但是我不 乘法在除法之前出现吗?

输入20时,华氏温度值在第一种情况下为68(正确),在第二种情况下为52。

123456789101112#include int main() {     float cel , fahr ;     printf("Enter the temperature(C):");     scanf("%f",&cel);     fahr = (9/5 * celt is  ) + 32;     printf("\ The temperature in fahranheit is %f",fahr); }

预期结果为68,但以上代码为52。 如果我将" 9/5"和" cel"的位置切换到正确的结果。 这是为什么 ?

相关讨论 如果使用9.0 / 5,会得到什么? (也:华氏温度。) 那不会编译... en.cppreference.com/w/c/language/operator_precedence应该给出一个想法。 (提示:当两个运算符具有相同的优先级时,它们按什么顺序求值?) @Geo Mukkath什么是"凯尔特人"? @VladfromMoscow is是定义为==的宏,但是仍然... 将华氏温度转换为摄氏的C程序始终显示零 复制/粘贴您实际尝试过的代码。 使用浮点字面量(如9.05.0而不是95)整数除法95为您提供1,而9.05.0为您提供1.8。 (C*9)5当C是浮点变量时,将首先将9转换为双精度,然后将结果(double)除以5.0。

乘法和除法在C中具有相同的优先级,并且具有从左到右的关联性。所以,

F = (C * 9/5 ) + 32等效于F = ((C * 9)/5) + 32 F = (9/5 * C) + 32等效于F = ((9/5) * C) + 32

除了C定义int / int = int丢弃余数的事实外,这两个表达式在代数上是等效的。因此,9/5不是您所期望的1.8,而是1。

若要通过将两个int除以得到浮点结果,您需要将至少一个操作数转换为float或double。因此,代替9/5,写:

9.0/5.0,9.0/5,9/5.0或1.8,为您提供double,或 9.0f/5.0f,9.0f/5,9/5.0f或1.8f,这将为您提供float 相关讨论 因此F = ((C * 9)5) + 32将比F = ((95) * C) + 32更精确 不,由于小数部分的整数截断,表达式:95结果为1 恕我直言,最好是使用所有浮点数,因为问题是关于温度的问题:F = 9.05.0 * C + 32.0;转换温度时,最好是以科学家而不是汇编程序设计师的方式来考虑:) OMG!该程序是K&R书的第二个示例!!!有人读吗?

是的,优先级(和整数运算)。

他们的评估如下:

1F = ((C * 9)/5 ) + 32;

1F = ((9/5) * C) + 32;

C执行整数算术(将整数朝零截断)的方式使第二个错误(9/5为1)。

而是使用9.f,5.f和32.f。这样,优先级不会有太大变化(您将获得正确的结果)。

这个表达

1C * 9/5

因为使用的运算符具有相同的优先级,所以从左到右进行评估。

因此,它像

1( C * 9 ) / 5

每次评估子表达式时,编译器都会确定所用操作数的通用类型。

子表达式的常见类型

1C * 9

根据通常的算术转换为float。因此,此子表达式的结果的类型为float,而整个表达式的结果为

1( C * 9 ) / 5

相应地具有float类型。

这个表达

19/5 * C

被评估为

1(9/5) * C

作为子表达式的两个操作数

19/5

是整数,则使用整数算术,子表达式的结果也是整数。

为了避免操作数顺序的依赖性,您可以例如编写

1(9.f/5) * C

要么

1(9/5.0f) * C

在这种情况下,子表达式

18.0f/5

18/5.0f

被评估为带有浮点数的表达式。

相关讨论 当所有算术运算都以浮点数完成时,为什么每个人都坚持使用整数?通过这种方法,C的新手将相信使用浮点字面量是一项昂贵的任务。一切都离现实不远了。

除优先级问题外,9/5的结果为1。如果编写的话,它将更像预期的那样工作

12349.0/5       or 9/5.0        or 9.0/5.0       or (even) 1.8

相关讨论 不要忘记f后缀。 OP正在处理float。 @ JL2210:除了最挑剔的编译器之外,不需要显式类型后缀f。该表达式将被评估为double,并在分配给fahr时被截断为float。 是的,但是总的来说,请尽量避免隐式类型更改(当您不注意时,它们会使您感到惊讶)。 @ JL2210隐式类型转换是该语言的功能。避免它们是愚蠢的。这样做首先会否定使用高阶语言的效用。自然地,您必须学会避免一些陷阱(此问题说明了一个花哨的问题),但是我不得不不同意您的笼统建议,即"避免隐式类型更改"。一般来说,他们很好。 隐式类型转换可以(而且经常会)产生不同于程序员期望值的值。这就是为什么编译器(启用警告时)会输出有关该问题的警告消息的原因



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3