编译器的未定义行为

时间:2014-08-02 14:30:48

标签: c

嘿,以下代码的输出是什么,它不能正常工作。

int j=65;
printf("j>=65?%d:%c",j);

在这种情况下,应打印:j>=65,然后将下一个%dj匹配,以便打印65,然后%c正在打印l如何打印l

4 个答案:

答案 0 :(得分:3)

而不是

Printf("j>=65?%d:%c",j);

必须至少

printf("j>=65?%d:%c",j);

代码具有未定义的行为,因为格式说明符的数量大于后续参数的数量。

我认为你的意思是以下

printf( j >= 65 ? "%d" : "%c", j );

在这种情况下,将会输出65。

答案 1 :(得分:0)

您不应在双引号内使用条件运算,例如printf("j>=65?%d:%c",j);。你有两个格式说明符,只有一个参数。所以它会导致未定义的行为。因此首先打印j>=65?%d打印65%c需要参数,但没有参数,因此它会打印任何内容。导致未定义的行为。您应该使用No of arguments等于格式说明符的编号。

当我在我的系统中运行你的代码时,我得到了 -

root@ubuntu:~/c/basics# cc con1.c
con1.c: In function ‘main’:
con1.c:6:1: warning: format ‘%c’ expects a matching ‘int’ argument [-Wformat=] // see this warning
printf("j>=65?%d:%c",j);
^
root@ubuntu:~/c/basics# ./a.out 
j>=65?65:� // see this undefined symbol

尝试以下更改并修复它 -

printf(j>=65 ? "%d" : "%c",j);

当条件为真时,它打印65,当条件失败时,它打印字符(对于该输入值)

j>=65 ? printf("%d",j) : printf("%c",j);

答案 2 :(得分:0)

格式说明符"j>=65?%d:%c"有两个%...个部分,它们表示要打印两个值。格式在printf("j>=65?%d:%c",j);中使用,只提供一个要打印的值。

在C中没有检查printf被赋予格式的正确参数数量,在运行时没有保护当给出的参数太少时实际发生的事情。这是未定义的行为。 C语言允许程序员编写许多导致未定义行为的东西。

答案 3 :(得分:0)

使用两个格式说明符调用printf(),但在格式字符串后只传递一个参数。该函数不知道您传递了多少个参数,因此它假设您确实传递了两个参数。结果是,它读取恰好位于内存位置的随机垃圾,如果你确实通过它,它将成为第二个参数。再运行一天,用不同的编译器或不同的选项编译它,你得到不同的结果(在最坏的情况下,分段错误)。