簡體   English   中英

(Q. 有點錯誤所以請檢查正文) C float *q=NULL; printf(“%f”,q); output 為 0.000000 但在 C++ 中 float *q=nullptr; cout&lt; <q; give output 0?< div><div id="text_translate"><p> <strong>[我的問題有點奇怪,但現在更改它是不對的,因為它得到了很好的解釋,但我正在使用 [Update].......[Update End] 標簽對其進行編輯,以避免對即將訪問我的訪問者造成混淆郵政]</strong></p><p> <strong>C</strong></p><pre> #include&lt;stdio.h&gt; int main() { float *q=NULL; printf("%f\n",q); }</pre><p> <strong>OUTPUT</strong></p><pre> 0.000000</pre><ul><li> 在 C output 為 0.000000</li><li> 所以這里 q 是浮點型 null 指針還是 q 是 (void *) 類型 null 指針?</li><li> 我覺得它是 (void *) 類型。</li><li> 因此格式(%f)和參數(void *)不匹配會調用未定義的行為並導致此類錯誤類型output</li></ul><p> <strong>[更新]</strong><strong>但是你會回答我自己的問題,我問的這么愚蠢的問題</strong></p><p>基本上我很困惑,我覺得我必須打印一些浮點類型或 void 類型,但關鍵是我正在打印地址,所以使用 %f 來打印地址只是愚蠢的。</p><p> 顯然 q 是浮點型指針,只是我覺得完全錯誤</p><p>通常我們使用 %u 來打印任何類型變量的地址(int,char,float)但是對於指針我們應該使用 %p</p><p> <strong>[更新結束]</strong></p><p> <strong>C++</strong></p><pre> #include&lt;iostream&gt; int main() { float *q=nullptr; std::cout&lt;&lt;q; }</pre><p> <strong>OUTPUT</strong></p><pre> 0</pre><ul><li> 在 C++ 中給出 output 0</li><li> 我認為這很好,因為它將第一個 memory 塊的地址指向任何內容</li><li>如果 q 是 nullptr_t 類型,那么 C++11 應該給出歧義錯誤意味着這里 q 是浮點類型 nullptr。</li></ul><p> <strong>[更新]</strong></p><p> C 和 C++ 標准都指定 null 指針常量比較等於零 - 他們沒有說明該地址的內容。</p><p> 顯然 q 只是浮點類型 nullptr</p><p> <strong>[更新結束]</strong></p><p> <strong>因此,如果我的兩個假設都是正確的,那么為什么在 C++ nullptr 中將其類型從 nullptr_t 更改為浮點類型,但在 C NULL 中將其類型更改為(void <em>)</em>不更改</strong>?</p><p> <strong>[更新]</strong></p><p> 我在 C 的第一個示例中的第一個假設 q 是 (void*) 類型已經是錯誤的,第二個假設是在第二個例子中。 C++ 的 q 是 nullptr_t 也是錯誤的。</p><p> 所以在這里總結一下</p><p>我試圖比較這發生在 C 和這發生在 c++ 我覺得這些事情是相互矛盾的</p><p>但實際上,在 C 中,我使用 %f 打印第一個錯誤的指針地址。 In C++ code all I think is all right except One thing that it is wrong to assume that null pointer points to 1st block of memory which is 0th as it is not specify in c standard it just say that nullptr constant compares to 0 when evaluate.</p><p> 這么多的錯誤只是問題,所以這不是正確的問題</p><p> <strong>[更新結束]</strong></p></div></q;>

[英](Q. is little wrong So please check body) C float *q=NULL; printf(“%f”,q) ; output is 0.000000 but in C++ float *q=nullptr; cout<<q; give output 0?

[我的問題有點奇怪,但現在更改它是不對的,因為它得到了很好的解釋,但我正在使用 [Update].......[Update End] 標簽對其進行編輯,以避免對即將訪問我的訪問者造成混淆郵政]

C

#include<stdio.h>
int main()
{
    float *q=NULL;
    
    printf("%f\n",q);
}

OUTPUT

0.000000
  • 在 C output 為 0.000000
  • 所以這里 q 是浮點型 null 指針還是 q 是 (void *) 類型 null 指針?
  • 我覺得它是 (void *) 類型。
  • 因此格式(%f)和參數(void *)不匹配會調用未定義的行為並導致此類錯誤類型output

[更新]但是你會回答我自己的問題,我問的這么愚蠢的問題

基本上我很困惑,我覺得我必須打印一些浮點類型或 void 類型,但關鍵是我正在打印地址,所以使用 %f 來打印地址只是愚蠢的。

顯然 q 是浮點型指針,只是我覺得完全錯誤

通常我們使用 %u 來打印任何類型變量的地址(int,char,float)但是對於指針我們應該使用 %p

[更新結束]

C++

#include<iostream>
int main()
{
    float *q=nullptr;
    std::cout<<q;
}

OUTPUT

0
  • 在 C++ 中給出 output 0
  • 我認為這很好,因為它將第一個 memory 塊的地址指向任何內容
  • 如果 q 是 nullptr_t 類型,那么 C++11 應該給出歧義錯誤意味着這里 q 是浮點類型 nullptr。

[更新]

C 和 C++ 標准都指定 null 指針常量比較等於零 - 他們沒有說明該地址的內容。

顯然 q 只是浮點類型 nullptr

[更新結束]

因此,如果我的兩個假設都是正確的,那么為什么在 C++ nullptr 中將其類型從 nullptr_t 更改為浮點類型,但在 C NULL 中將其類型更改為(void 不更改

[更新]

我在 C 的第一個示例中的第一個假設 q 是 (void*) 類型已經是錯誤的,第二個假設是在第二個例子中。 C++ 的 q 是 nullptr_t 也是錯誤的。

所以在這里總結一下

我試圖比較這發生在 C 和這發生在 c++ 我覺得這些事情是相互矛盾的

但實際上,在 C 中,我使用 %f 打印第一個錯誤的指針地址。 In C++ code all I think is all right except One thing that it is wrong to assume that null pointer points to 1st block of memory which is 0th as it is not specify in c standard it just say that nullptr constant compares to 0 when evaluate.

這么多的錯誤只是問題,所以這不是正確的問題

[更新結束]

 printf("%f\n",q);

格式說明符 %f 要求傳遞的 object 的類型是double類型( float參數將被隱式轉換,所以也可以)。 您傳遞了一個錯誤類型的float* 將錯誤類型的參數傳遞給printf會導致未定義的行為。

 printf("%p",q);

這個有點微妙,但是 %p 說明符要求參數的類型是void* float*仍然是錯誤的類型,因此行為仍未定義。

您應該更加小心使用正確的格式說明符和參數類型。 C 格式化的 I/O API 是非常無情的。


在 C++ 中給出 output 0

請注意,您獲得的 output 是否為 0 或其他值取決於系統用於表示 null 指針的值。

為什么在 C++ nullptr 將其類型從 nullptr_t 更改為浮點類型

在您的示例中, nullptr從未“將其類型更改為浮點類型”。 float *q=nullptr中,隱式轉換為float*類型。

但是在 C NULL 中沒有將其類型從 (void ) 更改為 (float)?

NULL宏的類型在 C 中不void 它可以是 integer 常量 0,或者轉換為void*的常量。 這兩者都可以隱式轉換為任何指針類型。 這就是float *q=NULL中發生的情況。

因此,在這兩種語言中,您都將 null 隱式轉換為指針類型。


無論哪種類型可以隱式轉換為哪種類型,可變參數 arguments 都不會隱式轉換為格式字符串所需的類型,因為編譯器不知道這些類型1 2

1 我提到了從 float 到 double 的轉換,但這些轉換不依賴於格式說明符。

2 如果格式字符串是常量,一些編譯器確實有助於診斷您的錯誤,但它們不是必須這樣做的。

指針沒有改變類型。 在 cout 版本中,您讓系統自然打印指針值。 在 printf 版本中,您強制使用 %f。 將格式字符串更改為 %ld,您將得到不同的結果。

printf 對您傳遞的 arguments 一無所知。 它相信程序員知道他在做什么。

--- 在此處編輯以回答更多問題 ---

你說得對,%lu 可能比 %ld 好。 我想您可能有一個設置了最高有效位的地址(這意味着 %ld 會認為它是負數)。

是的:

float * q = nullptr;

意味着q是全零。

Cout 知道正在打印什么,並且(通常)做正確的事情。 除非您非常明確地控制它(例如打印浮點數和雙精度時使用的位數),否則很少使用格式說明符。 我用它來設置布爾值的默認 output 以打印truefalse而不是10 但一般來說,當您使用 cout 時,您會得到理智的值,而無需任何額外的工作或認為是必要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM