2010-09-23 194 views

回答

3

在這種情況下,bitmapSize.width的類型爲CGFloat(iPhone上的當前爲float)。

float轉換爲size_t有未定義的行爲(根據C標準 - 不知道蘋果是否提供任何進一步的保證)如果轉換的值不適合一個size_t。當它適合時,轉換會丟失小數部分。轉換是隱式還是顯式都沒有區別。

在代碼中顯示轉換髮生,因此讀取代碼的程序員不會忘記,這個轉換是「好的」。從某種意義上說,它是「壞」的,它可能會壓制編譯器會給你的任何警告,說明這種轉換是危險的。

因此,如果您絕對有信心轉換將始終有效,那麼您需要投射(以抑制警告)。如果你沒有信心,那麼你不需要演員(你可能應該避免轉換或者自信)。

在這種情況下,就尺寸而言,轉換似乎是安全的。假設你的CGSize對象代表了一個實際的UI元素的大小,它不會那麼大。代碼中的評論會很好,但是這是程序員在第五十次之後停止評論的事情,並且開始認爲它是「明顯的」,當然圖像寬度適合於size_t

還有一個問題是轉換對分數是否安全。在什麼情況下,如果有的話,大小是否分數?

+0

其實,它是一個CGFloat。在iphone上,這意味着itr目前是* float,但是蘋果可能會選擇在以後使用它(他們已經在Mac OS X運行時改變了它)。)。 – JeremyP 2010-09-23 12:47:23

+0

@JeremyP:夠公平的。 – 2010-09-23 13:58:08

+0

我想我只是使用CGFloat代替。這樣做的目標是得到一個沒有小數位的整數。 – openfrog 2010-09-23 15:02:15

2

C支持隱式轉換,並且如果由於某種原因size_t不如CGSize精確,您也會收到警告。

4

您應該使用正確的類型,可能是CGFloat。 size_t是int'ish和不適當的。

+0

取決於您使用的是什麼。舉一個例子,'CGBitmapContextCreate'爲它的寬度參數使用'size_t'。 – 2010-09-23 17:04:32

1

通常不需要演員(有時是錯誤的)。 C大部分時間都是「正確的事情」。

就你而言,演員陣容是不需要的(但沒有錯,只是多餘的)。

你需要投

  • 參數與printf當他們不轉換規範
    printf("%p\n", (void*)some_pointer)
  • 參數匹配is*()(ISDIGIT,ISBLANK,...)和toupper()tolower()
    if (isxdigit((unsigned char)ch)) { /* ... */ }
  • (如果我還記得更多,我會在這裏添加它們)
+0

您應該將'is */to *'的參數強制轉換爲'(unsigned char)',而不是簡單的'(unsigned)'。 – schot 2010-09-23 15:29:21

+0

謝謝schot,改變了 – pmg 2010-09-23 16:18:48

1

size_t類型是爲了完全不同的東西,你不應該將它用於這種目的。
其目的是表達內存中不同類型的大小。例如,sizeof(int)的類型爲size_t,它返回int類型的大小。

正如其他人所建議的那樣,爲該變量使用適當的類型。