[英]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.