为什么此代ç ä¸­çš„结果ä¸åŒï¼Ÿ

时间:2019-11-07 15:19:19

标签: c

#include<stdio.h>
int main() {
    int d = -8623;
    printf("|%6D|", d);
    return 0;
}

我用我的电脑并è¿è¡Œå®ƒï¼Œç»“果是:|D|,但标准答案是:|%6D|,与在线IDE相åŒã€‚

3 个答案:

答案 0 :(得分:1)

替æ¢

printf("|%6D|", d);

使用

printf("|%d|", d);

%d是带符å·æ•´æ•°çš„正确格å¼ã€‚本地PC和在线IDE的答案有所ä¸åŒï¼Œå› ä¸ºæ‚¨è°ƒç”¨äº†æœªå®šä¹‰çš„行为。

答案 1 :(得分:0)

printf的调用具有未定义的行为,因为使用了错误的格å¼è¯´æ˜Žç¬¦ã€‚

è¦èŽ·å¾—“预期结果â€ï¼Œæ‚¨è‡³å°‘应该写出

printf("|%%6D|", d);

尽管编译器会报告错误,因为在函数调用中有未使用的å‚æ•°d。

答案 2 :(得分:0)

  

为什么这段代ç ä¸­çš„结果ä¸ä¸€æ ·ï¼Ÿ

在C standard中æ述了用C编写的程åºåœ¨ç¼–译和执行åŽçš„行为。

我们å¯ä»¥è‡ªç”±è®¿é—®çš„标准è‰æ¡ˆåœ¨C11 7.21.6.1p6中指出,如果printf转æ¢è§„范无效,则“行为未定义â€ã€‚ %D是无效的转化-(f)printf description中没有列出D转化说明符。

未定义行为一è¯çš„定义如C11 3.4.3p1:

  

使用éžä¾¿æºå¼æˆ–错误程åºæž„造或错误数æ®æ—¶çš„行为,而本国际标准对此ä¸æ–½åŠ ä»»ä½•è¦æ±‚

您æ供的代ç æ²¡æœ‰è¦æ±‚。它å¯ä»¥ä»¥ä»»ä½•æ–¹å¼è¡¨çŽ°ï¼Œä½†æ˜¯å¯ä»¥æ ¹æ®éœ€è¦-打å°ä»»ä½•å†…容,开始第三次世界大战或spawn dragons。 in this stackoverflow threadå¯ä»¥æ‰¾åˆ°æ›´å¤šæœ‰å…³æœªå®šä¹‰è¡Œä¸ºçš„ä¿¡æ¯ã€‚

如果程åºä¸­çš„行为未定义,则å¯èƒ½å‘生任何事情,并且没有“标准答案â€ã€‚执行的结果是ä¸å¯é¢„测的,并且会éšçŽ¯å¢ƒï¼Œç¼–译器或编译器版本而å˜åŒ–。奇怪的是,ä¸åŒçš„环境对于具有未定义行为的代ç çš„行为也会有所ä¸åŒã€‚

您看到的差异æ¥è‡ªåœ¨æ‚¨æµ‹è¯•çš„ä¸åŒå¹³å°ä¸Šå®žæ–½printf的差异。您的本地printf实现与您å°è¯•è¿‡çš„“在线IDEâ€ä¸­çš„printf实现ä¸åŒï¼Œè¿™å°±æ˜¯ä¸ºä»€ä¹ˆæ‚¨èŽ·å¾—ä¸åŒç»“果的原因。