![](/img/trans.png)
[英]How can I return a struct if a condition is true and an int if the condition is false
[英]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.