Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么在C中使用floor()时会定义两次类型?_Objective C_C - Fatal编程技术网

Objective c 为什么在C中使用floor()时会定义两次类型?

Objective c 为什么在C中使用floor()时会定义两次类型?,objective-c,c,Objective C,C,我正在尝试学习C/Objective-C。在这本书中,我将学习(Objective-C编程:Big nerd Ranch指南),他们在这个变量上设置了两次类型。为什么?当我删除操作符右侧的(unsigned int)时,它仍然可以正常工作 unsigned int feet = (unsigned int)floor(rawFeet); 说类型被定义了两次是不正确的。定义类型意味着创建新类型。在这里,这种类型被提到了两次。在左侧,它用于定义一个名为feet的变量,类型为unsigned int

我正在尝试学习C/Objective-C。在这本书中,我将学习(Objective-C编程:Big nerd Ranch指南),他们在这个变量上设置了两次类型。为什么?当我删除操作符右侧的
(unsigned int)
时,它仍然可以正常工作

unsigned int feet = (unsigned int)floor(rawFeet);

说类型被定义了两次是不正确的。定义类型意味着创建新类型。在这里,这种类型被提到了两次。在左侧,它用于定义一个名为
feet
的变量,类型为
unsigned int
。在右侧,它用于将
floor
的返回值转换为
无符号int
,以将
double
返回给变量赋值

一个旁注:如果你知道rawFeet是肯定的,我会假设使用unsigned,那么发言是完全没有必要的。相反,您可以将rawFeet强制转换为unsigned int

e、 g

此外,评论中提到演员阵容是不必要的。这可能是真的,但许多编译器会正确地警告您这样做。在Visual C++中,例如:

unsigned int feet = floor(rawFeet);

// warning C4244: 'initializing' : conversion from 'double' to 'unsigned int', possible loss of data

不要仅仅因为其他语言与您要学习的语言有某种关联就使用它们进行标记。您只需定义一次类型。第二个(不必要的)是cast。@重复数据消除工具我给它贴上了C标签,因为在书中说我们在进入Objective-C之前先学习C,所以我认为这仍然是C的一部分。不是吗?@rmaddy你是说它不必要,但为什么要使用它?当它被使用时,它到底在做什么?在这种情况下,它绝对不需要。要了解它是什么,请阅读C中的“演员表”。你甚至不需要演员表。赋值过程中,
double
将隐式转换为
无符号int
。@maddy。这取决于你的编译器。msvc将给出一个警告,如果您的警告被视为错误,那么。“好吧,你知道的。”杰克:谢谢你,这肯定澄清了它的用法。但是,当您试图只获取整数部分而忽略小数部分(如3.14所示)时,为什么调用floor是不必要的呢。“铸造也会做同样的事情吗?”迈克尔瑞德。是,从
双精度
转换为
整数只会截断小数点后的任何内容。但是,您必须小心,因为截断正数与
floor
相同,但截断负数与
ceil
@maddy相同,因为它提供了
(无符号)
,它让编译器和代码审阅者都知道从
缩小到
(无符号)
是故意的。忽略它会引发一个问题:“代码知道会发生什么吗?”
unsigned int feet = floor(rawFeet);

// warning C4244: 'initializing' : conversion from 'double' to 'unsigned int', possible loss of data