我有一个关于带有三元运算符的sizeof
运算符的小代码:
#include <stdio.h>
#include <stdbool.h>
int main()
{
bool a = true;
printf("%zu\n", sizeof(bool)); // Ok
printf("%zu\n", sizeof(a)); // Ok
printf("%zu\n", sizeof(a ? true : false)); // Why 4?
return 0;
}
输出(GCC):
1
1
4 // Why 4?
但在这里,
printf("%zu\n", sizeof(a ? true : false)); // Why 4?
三元运算符返回boolean
type和sizeofbool
type是C中的1
字节。
那么为什么sizeof(a?true:false)
会给出四个字节的输出呢?
三元运算符是一种转移注意力的方法。
printf("%zu\n", sizeof(true));
Print 4(或您平台上的任何sizeof(int)
)。
以下假设bool
是char
或类似类型的大小1的同义词,并且int
大于char
。
为什么sizeof(true)!=sizeof(bool)
和sizeof(true)=sizeof(int)
只是因为true
不是bool
类型的表达式。这是一个类型为int
的表达式。它是#在
。stdbool中将
d定义为1
。h
C中根本没有类型为
编辑:此段落不正确,bool
的右值。即使用作
sizeof
的参数,每一个这样的右值都会立即提升为
int
sizeof
的参数不会升级为int
。但这并不影响任何结论。
这里,三元运算符返回boolean
type,
好吧,还有更多!
在C语言中,这个三元运算的结果是类型int
[以下注释(1,2)]
因此,结果与平台上的表达式sizeof(int)
相同。
注1:引用C11
,第§7.18章,布尔类型和值
[......]其余三个宏适用于
#if
预处理指令。它们是
true
扩展到整数常量1,
false
它扩展为整数常量0,[…]
注2:对于条件运算符,第6.5.15章,(强调我的)
评估第一个操作数;在其评估和第二个或第三个操作数的评估之间有一个序列点(以评估的为准)。仅当第一个比较不等于0时才评估第二个操作数;仅当第一个比较等于0时才评估第三个操作数;结果是第二个或第三个操作数的值(以评估的为准),[...]
和
如果第二个和第三个操作数都有算术类型,则结果类型就是结果的类型,该类型由应用于这两个操作数的常用算术转换决定。[....]
因此,结果将是integer类型,并且由于值的范围,常数的类型正好是
int
。
也就是说,一个通用建议,
int main()
最好是int main(val)
才能真正符合标准。
这是因为你有#include
printf("%zu\n", sizeof(a ? 1 : 0)); // Why 4?
sizeof(int)
在您的平台上是4。
我一直在研究一些涉及将ASCII值转换为字符串的问题。 如果我使用此代码,我会以的形式输出,这是意料之中的。 但是,如果我这样更改代码: 当我尝试编译它时,会显示以下错误: 两种代码之间的唯一区别是,在第1种代码中,我使用的是t=I‘a’ ,在秒时,<代码>t=t i“a” 。 有人能告诉我第二段有什么问题吗?
Java 中的字节长度为 8 位。一个
问题内容: 在我的实际项目中,这是我修改后的小程序,偶然发生。 我不知道为什么它给输出 10 吗? 之后,我放了两个零,仍然给出输出10。 然后我将 012 更改 为0123 ,现在输出83? 谁能解释为什么? 问题答案: 比我将012更改为0123,现在输出为83? 因为它被当作八进制基数(8),因为该数字的前导数字为0。因此,它对应的十进制值为10。 012: 0123:
使用sizeof()打印变量的大小 为什么sizeof()返回int的大小,而不是短int,即2个字节?
问题内容: 为什么Java类文件的前四个字节格式为 CAFEBABE ?谁命名的? 您的看法/猜测? 资料来源:IBM Java编程动力学 问题答案: Java编程语言之父James Gosling曾经解释如下: 据我所知,我是有罪的一方。我完全不知道NeXT连接。少量有趣的十六进制单词可能是匹配的来源。至于使用Java 的派生,它有些circuit回: 我们曾经在一个叫St Michael’s
问题内容: 查看以下代码,并请解释为什么该方法和函数给出两个不同的输出。 输出: 问题答案: 计算子字符串的非重叠出现次数: 返回substring sub 的不重叠出现的次数。 在字符串中恰好有一个这样的子字符串出现的位置:就在开头。因此计数 应该 返回。 一般来说,空字符串将匹配给定字符串中的 所有位置 ,包括开始和结束处的正确 位置 ,因此计数应 始终 为长度加1: 这是因为空字符串被认为存