来自嵌套printf statemenets

时间:2016-10-21 09:15:57

标签: c printf output

好的,我正在玩一些代码,尝试了解一些技巧以及它是如何工作的,所以我不明白这段代码的输出

int i = 8;
printf("%d", printf("%o", i));

这个结果是102,我不知道怎么样,我知道八进制中的8是10,但最让我困惑的是当我在这样%o之后放空格时

printf("%d", printf("%o ", i));

现在,结果是10 3,这里发生了什么?

3 个答案:

答案 0 :(得分:5)

外部printf()将打印内部C11的返回值。

引用fprintf,章节§7.21.6.1,

  

printf("%d", printf("%o", i)); 函数返回传输的字符数或负值   如果发生输出或编码错误。

所以,在第一种情况下,

printf()

内部10打印printf(),即两个字符,这是调用的返回值,外部102打印出来。两个相邻打印语句的输出显示为printf()

类似地,当您在内部10 <space>的格式说明符中放置空格后,它会打印(并返回)3,因此在3之后,会打印static boolean isBalanced(String s) { Deque<Character> operators = new LinkedList<>(); operators.push('#'); for (int i = 0; i < s.length(); ++i) { if (operators.isEmpty()) return false; char ch = s.charAt(i); switch (ch) { case '(': operators.push('#'); break; case ')': operators.pop(); break; case '+': switch (operators.peek()) { case '#': operators.pop(); operators.push(ch); break; case '+': break; default: return false; } break; case '|': switch (operators.peek()) { case '#': operators.pop(); operators.push(ch); break; case '|': break; default: return false; } break; } } return operators.size() == 1; } 。< / p>

答案 1 :(得分:5)

Printf打印到标准输出,并返回int,打印字符数。 所以你得到:

10 3

是:

10是评估的内部printf,它打印八进制8。

和3,评估的外部printf打印内部printf = 3打印字符的“返回”值。

答案 2 :(得分:0)

822

int i = 8; printf("%d", printf("%o", i)); 返回打印的字符数,之前打印printf为2。评估顺序意味着您将获得10作为输出。或者更确切地说是102然后是10,而中间没有换行符或空格。

在您的第二个示例中,您获得2(注意空格),然后103是3个字符,10)作为{{1 }}