嘿,以下代码的输出是什么,它不能正常工作。
int j=65;
printf("j>=65?%d:%c",j);
在这种情况下,应打印:j>=65
,然后将下一个%d
与j
匹配,以便打印65
,然后%c
正在打印l
如何打印l
。
答案 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(),但在格式字符串后只传递一个参数。该函数不知道您传递了多少个参数,因此它假设您确实传递了两个参数。结果是,它读取恰好位于内存位置的随机垃圾,如果你确实通过它,它将成为第二个参数。再运行一天,用不同的编译器或不同的选项编译它,你得到不同的结果(在最坏的情况下,分段错误)。