下面的一些琐碎的示例代码有问题: (在Visual Studio 2015中)
请忽略指向文本常量,在newwer编译器上可能出现的警告或错误的部分,
我的问题是为什么它会输出'0'以及while循环如何工作,尝试同时使用调试器和printf。我对问题的理解是这样的:
将ptr移至“ e”
检查ptr的内容是“ e”,它不是0,所以它进入while循环
然后它在'o'之后增加ptr并得到'\ 0',根据我的逻辑,这时它不应进入循环,但是我这样做了,并且当它指向终止符时,也不再经过一步在垃圾?!?
我查看了另外两个主题this topic about operator precedence和this one about the while(*ptr) case going over the terminator,但是从第二个原因我不明白为什么它进入循环,然后又增加了指针值?对于我理解的顺序是先增加指针,然后用*
获取值#include <cstdio>
#include<stdlib.h>
int main(void) {
char* str = "hello";
char* ptr = str;
char least = 127;
while (*ptr++) {
printf("%c-", *ptr);
least = ((*ptr) < (least)) ? (*ptr) : (least);
}
printf("%d\n", least);
}
答案 0 :(得分:2)
在循环内部,您没有使用在$xml_hash = {
'images' => [
{
'image' => [
{
'uri150' => '',
'type' => 'primary',
'uri' => '',
'height' => '511',
'width' => '600'
},
{
'type' => 'secondary',
'uri150' => '',
'uri' => '',
'height' => '519',
'width' => '600'
},
{
'uri' => '',
'height' => '521',
'width' => '600',
'type' => 'secondary',
'uri150' => ''
},
etc...
条件下测试过的相同字符。
由于while
是后递增的,因此它将返回ptr++
的当前值,然后对其进行递增。因此,当ptr
指向ptr
字符时,您会这样做
o
它测试while (*ptr++)
,它不为零,因此它将进入循环。但是在测试之后,它递增'o'
指向下一个字符,所以现在它指向ptr
。然后它将打印此字符并为其设置'\0'
。
在处理完指针后,应增加指针。您可以通过将least
移动到循环主体的末尾来实现。或者,您可以使用ptr++
循环而不是for
:
while
答案 1 :(得分:0)
最后一个printf调用将字符串文字的结尾零输出为整数。
为清楚起见,请考虑一个带有一个实际字符的字符串文字,例如"A"
。
while循环的第一次迭代之前
while (*ptr++)
{
printf("%c-", *ptr);
least = ((*ptr) < (least)) ? (*ptr) : (least);
}
指针ptr指向字符串文字的字符“ A”。这个表情
*ptr++
可以想象像
char c = *ptr;
++ptr;
因此,由于“ A”不等于零,因此控制传递至循环的主体。同时,在评估条件之后指针ptr增大。因此,现在它指向字符串文字的终止零“ \ 0”。
由于0小于123,因此变量的最小值最小为0。
least = ((*ptr) < (least)) ? (*ptr) : (least);
在循环的下一次迭代中,ptr仍指向终止的零。因此,控件绕过了循环的主体,在循环之后的下一条语句中输出了零。
根据C标准(6.5.2.4 Postfix递增和递减运算符)
2 postfix ++运算符的结果是 操作数。副作用是,操作数对象的值为 递增(即,将适当类型的值1添加到 它)。