簡體   English   中英

如果在給定條件字符串的情況下將其視為true,則返回什么?

[英]If in if condition string is given it is treated as true but what it return?

為什么將if條件中的字符串文字准確地視為true?

if("whatiamreturning")
//this is true. I want to know y?

基於上述情況,這里會發生什么?

#‎include‬<stdio.h>
void main() {
    static int i;
    for(;;) { //infinite loop
        if(i+++"The Matrix")
            // what is happening in the above line?
            printf("Memento");
        else
            break;
    }
}

它將返回字符串whatiamreturning的第一個元素的地址。
基本上,當您將字符串文字分配給char指針時

char *p;
p = "whatiamreturning";

賦值不會復制whatiamreturning的字符,而是使p指向字符串的第一個字符,這就是為什么字符串文字可以使用下whatiamreturning原因

char ch = "whatiamreturning"[1];

ch現在將具有字符h 之所以whatiamreturning ,是因為編譯器將whatiamreturning視為char *並計算了文字的基址。


if(i+++"The Matrix")等效於

if( i++ + "The Matrix")  

或者可以將其重寫為

if(&("The Matrix"[i++]))    

這對於每個i都是true ,並導致無限循環。 最終,由於變量i整數溢出,代碼將遭受不確定的行為

  if(i+++"The Matrix") // what is happening here please help here to understand 

這將采用i的值,將字符串"The Matrix"在內存中的位置的指針值相加並將其與零進行比較。 之后,它將i的值增加一。

它不是很有用,因為指針值基本上可以是任何隨機數(它取決於體系結構,操作系統等)。 這樣,整個程序就等於隨機打印了Memento次(盡管每次運行可能都相同)。

也許您打算寫if(*(i+++"The Matrix")) 這將循環10次,直到i+"The Matrix"求出指向字符串末尾NUL字節的地址,然后*(i+"The Matrix")將返回0

順便說一句,空格是使代碼更具可讀性的好方法。

if("whatiamreturning") 

相當於

if (1)

這是因為"whatiamreturning"是一個char [] ,它會分解為if()內部的非NULL char const* 在布爾表達式的上下文中,任何非NULL指針的計算結果都為true

if(i+++"The Matrix") 

可以簡化為:

if( (i++) + "The Matrix") 

在循環的第一次迭代中, i值為0 因此, (i++) + "The Matrix"計算結果為"The Matrix"

在循環的第二次迭代中, i值為1 因此, (i++) + "The Matrix"計算結果為"he Matrix"

但是,循環永遠不會結束並且進入未定義行為的領域,因為(i++) + "The Matrix"永遠不會求值為0並且i的值會不斷增加。

也許他們打算使用:

  if(i++["The Matrix"])

經過10次迭代后, if()的表達式將變為0

更新資料

如果您遵循別人的代碼,請遠離他們寫的其他任何東西。 main功能可以清除為:

int main() {
    char name[] = "The Matrix";
    int i = 0;
    for( ; name[i] != '\0'; ++i )
    {
        printf("Memento\n");
    }
}

為什么將if條件中的字符串文字准確地視為true?

 if("whatiamreturning") 

字符串文字"whatiamreturning"char[]類型的常量。
在幾乎所有上下文(包括該上下文)中,數組都會衰減到指向其第一個元素的指針。
在布爾上下文,等的條件下if語句來,所有的非零值都為真。
當指針指向對象時,它不是空指針,因此為true。

基於上述情況,這里會發生什么?

 #‎include‬<stdio.h> void main() { 

上面是您的Undefined Behavior的第一個實例,無論發生什么,都是正確的。
現在,我們將用int代替void來糾正錯誤。

現在,您的循環:

    static int i;

靜態變量是默認初始化的,所以i從0開始。

    for(;;) { //infinite loop
        if(i+++"The Matrix")
            // what is happening in the above line?
            printf("Memento");
        else
            break;
    }

此循環也具有未定義的行為

該條件采用i並將其添加到字符串文字"Memento" ,該字符串文字像前面的示例一樣衰減為指針,在布爾上下文中解釋結果指針,並作為副作用使i遞增。
只要i在輸入時不超過strlen("The Matrix")+1 ,一切就可以了,指針指向字符串文字的一個元素或一個過去,並且該標准保證該指針不是空指針。
然而,由於計算這樣的指針是Undefined Behavior ,所以一切都變得混亂了

好了,既然我們知道該循環是UB,那么讓我們也忽略該循環。 該程序的其余部分是:

}

沒關系,因為即使main的返回類型為int ,也有一條特殊的規則指出,如果控制到達main的末尾而不執行return -statement,則隱式return 0;否則, return 0; 被添加。

旁注:如果某個程序的執行在任何地方都遇到“未定義行為”,則整個程序都是未定義的,不僅是從那時起: 未定義行為會導致時間旅行(除其他外,時間旅行是最有趣的)

暫無
暫無

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

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