繁体   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