C 如果条件字符串被给定,它将被视为true,但它返回什么?

C 如果条件字符串被给定,它将被视为true,但它返回什么?,c,if-statement,C,If Statement,为什么if条件中的字符串文字被视为true if("whatiamreturning") //this is true. I want to know y? if("whatiamreturning") 基于上述情况,这里发生了什么 #‎include‬<stdio.h> void main() { static int i; for(;;) { //infinite loop if(i+++"The Matrix") //

为什么if条件中的字符串文字被视为true

if("whatiamreturning")
//this is true. I want to know y?
if("whatiamreturning")
基于上述情况,这里发生了什么

#‎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;
    }
}
#‎include‬<stdio.h>
void main() {
#‎包括‬
void main(){
静态int-i;
对于(;){//无限循环
if(i++“矩阵”)
//上面这一行发生了什么?
printf(“纪念品”);
其他的
打破
}
}

它将返回字符串的第一个元素的地址
whatiamreturning

基本上,当您将字符串文字指定给
char
指针时

char *p;
p = "whatiamreturning";
赋值不会复制
whatiamreturning
中的字符,而是使
p
指向字符串的第一个字符,这就是为什么可以为字符串文本编写子脚本

char ch = "whatiamreturning"[1];
ch
现在将具有字符
h
。这是因为编译器将
whatiamreturning
视为
char*
并计算文本的基址


如果(i++“矩阵”)
等效于

if( i++ + "The Matrix")  
或者可以重写为

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

对于每个
i
,它都是
true
,并导致无限循环。最终,由于变量
i
的整数溢出,代码将遭受未定义行为的影响

它将返回字符串的第一个元素的地址
whatiamreturning

基本上,当您将字符串文字指定给
char
指针时

char *p;
p = "whatiamreturning";
赋值不会复制
whatiamreturning
中的字符,而是使
p
指向字符串的第一个字符,这就是为什么可以为字符串文本编写子脚本

char ch = "whatiamreturning"[1];
ch
现在将具有字符
h
。这是因为编译器将
whatiamreturning
视为
char*
并计算文本的基址


如果(i++“矩阵”)
等效于

if( i++ + "The Matrix")  
或者可以重写为

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

对于每个
i
,它都是
true
,并导致无限循环。最终,由于变量
i
的整数溢出,代码将遭受未定义行为的影响

它将返回字符串的第一个元素的地址
whatiamreturning

基本上,当您将字符串文字指定给
char
指针时

char *p;
p = "whatiamreturning";
赋值不会复制
whatiamreturning
中的字符,而是使
p
指向字符串的第一个字符,这就是为什么可以为字符串文本编写子脚本

char ch = "whatiamreturning"[1];
ch
现在将具有字符
h
。这是因为编译器将
whatiamreturning
视为
char*
并计算文本的基址


如果(i++“矩阵”)
等效于

if( i++ + "The Matrix")  
或者可以重写为

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

对于每个
i
,它都是
true
,并导致无限循环。最终,由于变量
i
的整数溢出,代码将遭受未定义行为的影响

它将返回字符串的第一个元素的地址
whatiamreturning

基本上,当您将字符串文字指定给
char
指针时

char *p;
p = "whatiamreturning";
赋值不会复制
whatiamreturning
中的字符,而是使
p
指向字符串的第一个字符,这就是为什么可以为字符串文本编写子脚本

char ch = "whatiamreturning"[1];
ch
现在将具有字符
h
。这是因为编译器将
whatiamreturning
视为
char*
并计算文本的基址


如果(i++“矩阵”)
等效于

if( i++ + "The Matrix")  
或者可以重写为

if(&("The Matrix"[i++]))    
对于每个
i
,它都是
true
,并导致无限循环。最终,由于变量
i
的整数溢出,代码将遭受未定义行为的影响

这将取
i
的值,在内存中添加字符串
“矩阵”
位置的指针值,并将其与零进行比较。之后,它会将
i
的值增加一

这不是很有用,因为指针值基本上可以是任何随机数(取决于体系结构、操作系统等)。因此,整个程序相当于打印
Memento
随机次数(每次运行的次数可能相同)

也许你想写
if(*(i++“矩阵”)
。这将循环10次,直到它
i+“矩阵”
计算到字符串末尾指向
NUL
字节的地址,因此
*(i+“矩阵”)
将返回
0

顺便说一句,空格是提高代码可读性的好方法

if("whatiamreturning") 
这将取
i
的值,在内存中添加字符串
“矩阵”
位置的指针值,并将其与零进行比较。之后,它会将
i
的值增加一

这不是很有用,因为指针值基本上可以是任何随机数(取决于体系结构、操作系统等)。因此,整个程序相当于打印
Memento
随机次数(每次运行的次数可能相同)

也许你想写
if(*(i++“矩阵”)
。这将循环10次,直到它
i+“矩阵”
计算到字符串末尾指向
NUL
字节的地址,因此
*(i+“矩阵”)
将返回
0

顺便说一句,空格是提高代码可读性的好方法

if("whatiamreturning") 
这将取
i
的值,在内存中添加字符串
“矩阵”
位置的指针值,并将其与