Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ sprintf未定义的行为_C++_C - Fatal编程技术网

C++ sprintf未定义的行为

C++ sprintf未定义的行为,c++,c,C++,C,我似乎找不到这方面的信息:在sprintf中使用错误的格式说明符是否会导致printf中出现UB-like 我也会问,这里有没有以下UB unsigned int x = 5; printf("%d",x); unsigned int x = 5; printf("%d",x); 或者这个: unsigned char x = 5; printf("%d",x); unsigned char x = 5; printf("%d",x); 在spri

我似乎找不到这方面的信息:在
sprintf
中使用错误的格式说明符是否会导致
printf
中出现UB-like

我也会问,这里有没有以下UB

unsigned int x = 5;
printf("%d",x);
unsigned int x = 5;
printf("%d",x);
或者这个:

unsigned char x = 5;
printf("%d",x);
unsigned char x = 5;
printf("%d",x);
sprintf
中使用错误的格式说明符是否会导致
printf
中出现UB-like

对。所有
*printf
说明符的定义都相同(实际上在
fprintf
部分)

我也会问,这里有没有以下UB

unsigned int x = 5;
printf("%d",x);
unsigned int x = 5;
printf("%d",x);
从技术上讲,这是一个错误<代码>%d需要一个
int
参数,并且“如果任何参数不是相应转换规范的正确类型,则行为是未定义的。”(WG14 N1570,7.21.6.1/p9;我认为C11与C99相比没有任何变化)
unsigned int
不是
int
。在实践中,你可能会侥幸逃脱

或者这个:

unsigned char x = 5;
printf("%d",x);
unsigned char x = 5;
printf("%d",x);
当且仅当
unsigned char
通过整数提升提升为
int
时(通常情况下),这不是UB

sprintf
中使用错误的格式说明符是否会导致
printf
中出现UB-like

对。所有
*printf
说明符的定义都相同(实际上在
fprintf
部分)

我也会问,这里有没有以下UB

unsigned int x = 5;
printf("%d",x);
unsigned int x = 5;
printf("%d",x);
从技术上讲,这是一个错误<代码>%d需要一个
int
参数,并且“如果任何参数不是相应转换规范的正确类型,则行为是未定义的。”(WG14 N1570,7.21.6.1/p9;我认为C11与C99相比没有任何变化)
unsigned int
不是
int
。在实践中,你可能会侥幸逃脱

或者这个:

unsigned char x = 5;
printf("%d",x);
unsigned char x = 5;
printf("%d",x);

这不是UB,当且仅当
无符号字符
通过整数提升提升为
int
,通常是这样。

请一次提一个问题。在
sprintf()
中使用错误的格式说明符会导致UB,就像在
printf()
中一样,对于
printf
函数系列的所有其他成员也是如此。请每次提问一个问题。在
sprintf()
中使用错误的格式说明符会导致UB,就像在
printf()
中一样,
printf
函数族的所有其他成员也是如此。
unsigned char
被提升为
int
@KerrekSB“,这通常是这样的情况,“@T.C.:这让人困惑,似乎你提供了与Kerrek SB不同的答案above@dmcr_code:我删除了我的答案;T.C.对必须精确匹配的类型有正确的引用。此外,您可以静态测试
无符号字符
是如何提升的(例如,通过检查限制)。@dmcr\u code:只是为了记录我答案的要点:当您有一个带有变量参数(
)的函数,并且您使用任何类型的
int
调用它时,然后,您可以使用
va_arg
从参数列表中读取任何其他类型的
int
,它不是UB。(与C中没有原型的函数类似),但是
printf
的限制性更大。
unsigned char
被提升为
int
@KerrekSB”这一点并不一定正确。@T.C.:这让人困惑,似乎你提供的答案与Kerrek SB不同above@dmcr_code:我删除了我的答案;T.C.对必须精确匹配的类型有正确的引用。此外,您可以静态测试
无符号字符
是如何提升的(例如,通过检查限制)。@dmcr\u code:只是为了记录我答案的要点:当您有一个带有变量参数(
)的函数,并且您使用任何类型的
int
调用它时,然后,您可以使用
va_arg
从参数列表中读取任何其他类型的
int
,它不是UB。(与C中没有原型的函数类似),但是
printf
的限制性更大。