gpt4 book ai didi

c - 为什么 "strupr"的这个实现不起作用?

转载 作者:行者123 更新时间:2023-11-30 21:42:10 25 4
gpt4 key购买 nike

错误的实现(用gcc编译):

#include <stdio.h>
#include <ctype.h>

char* strupr( char *str )
{
while(*str) {
*str++ = toupper(*str);
}

return str;
}

int main(void) {

char string[] = { "Test String!" };
strupr( string );
puts( string );

return 0;
}

该函数以意想不到的方式更改字符串,其中转换为大写的字符仅从第二个字符开始。

注意str在作业中使用了两次。

最佳答案

此实现无效,因为它包含未定义的行为。

解释来自标准第6.5节第2段:

Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be read only to determine the value to be stored.

该标准给出了一个被视为未定义行为的表达式示例来阐明第二句话:

a[i++] = i;

在此表达式中,读取i的值不仅可以确定要存储的新值,还可以确定另一个值的存储位置。

这正是您的表达式中所发生的情况:

*str++ = toupper(*str);

唯一的区别是您的表达式使用指针,并在其间调用 toupper

这个要求看似武断,但却是有原因的。 C 标准允许编译器在调用 toupper 之前或之后使 ++ 的副作用可见,以允许编译器编写者获得最大的灵 active 。如果不限制 str 在表达式中的使用,这可能会导致不同平台上的不同行为,因此标准编写者决定彻底禁止它。

关于c - 为什么 "strupr"的这个实现不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36373780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com