繁体   English   中英

使用连续函数作为参数的printf,行为未定义

[英]printf with consecutive function as argument, undefined behavior

我知道下面的代码块会生成“未定义的行为”

#include <stdio.h>

char * foo(int i) {
    char static str[100];
    str[0] = 0;
    snprintf(str, sizeof(str), "%d", i);
    printf("foo %s\n", str);
    return str;
}

int main()
{
    printf("main %s %s\n", foo(12), foo(4));

    return 0;
}

我想知道此代码块与“ ISO / IEC 9899:1999(E):编程语言-C”中的“未定义行为”的情况相匹配。

这个 ?? “在两个序列点之间,一个对象被修改了一次以上,或者被修改并且除了确定要存储的值以外,还读取了先前的值(6.5)。” 但是这里是函数调用。

在此代码的两个序列点之间,没有一个对象被多次修改的实例。

foo作为函数参数的两次调用不是未定义的行为,而是未指定的行为 这意味着可能发生两件事或更多件事,但是标准没有指定哪件事。

在此示例中,由于可以按任意顺序评估函数参数,因此对foo的两次调用可以按任意顺序进行。 并且由于该函数始终返回指向静态缓冲区的指针,因此相同的数字将被打印两次,但不能保证您将得到“ 4 4”还是“ 12 12”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM