C和C++中的字符大小是多少?据我所知,char的大小在C和C++中都是1个字节.
#include <stdio.h>
int main()
{
printf("Size of char : %d\n", sizeof(char));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
#include <iostream>
int main()
{
std::cout << "Size of char : " << sizeof(char) << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
没有惊喜,它们都给出了输出: Size of char : 1
现在我们知道,字符表示为'a','b','c','|',...所以我只是修改了上面的代码对这些:
在C:
#include <stdio.h>
int main()
{
char a = 'a';
printf("Size of char : %d\n", sizeof(a));
printf("Size of char : %d\n", sizeof('a'));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Size of char …Run Code Online (Sandbox Code Playgroud) 我有一小段关于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;
}
Run Code Online (Sandbox Code Playgroud)
输出(GCC):
1
1
4 // Why 4?
Run Code Online (Sandbox Code Playgroud)
但在这里,
printf("%zu\n", sizeof(a ? true : false)); // Why 4?
Run Code Online (Sandbox Code Playgroud)
三元运算符返回boolean类型,sizeof bool类型是1C中的字节.
那为什么要sizeof(a ? true : false)输出四个字节?
我从网上找到了这个C程序:
#include <stdio.h>
int main(){
printf("C%d\n",(int)(90-(-4.5//**/
-4.5)));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个程序的有趣之处在于,当它在C89模式下编译和运行时,它会打印C89,当它被编译并在C99模式下运行时,它会打印出来C99.但我无法弄清楚这个程序是如何工作的.
你能解释一下第二个参数如何printf在上面的程序中起作用吗?
Size_t被定义为一个unsigned整数,但它的大小取决于你是在32位还是64位机器上.什么是正确和便携的打印方式size_t?
1. #define NUM 10
2. #define FOO NUM
3. #undef NUM
4. #define NUM 20
5.
6. FOO
Run Code Online (Sandbox Code Playgroud)
当我只运行预处理器时,输出文件包含20.
但是,根据我的理解,预处理器只是简单地替换文本.所以这就是我认为正在发生的事情(这显然是错误的但是很蠢):
所以我认为输出应该是10而不是20.可以解释它出错的地方吗?
难道保证(-x) % m,在这里x和m在C++中积极标准(C++ 0x中)为负,等于-(x % m)?
我知道它在我知道的所有机器上都是正确的.
取自http://www.ocf.berkeley.edu/~wwu/riddles/cs.shtml
它看起来非常适合我的编译器.不知道在哪找?
你能想到"一个程序",它为C和C++编译器提供了"不同的输出"(但是在同一种语言下提供了一致的输出)吗?
我刚刚阅读了一个关于SO讨论场景的问题,其中一段代码在C和C++中都有效,但会在每种语言中产生不同的行为.
这引出了一个问题:在C++代码中包含C头时,这可能是一个问题吗?
我从这个问题中知道你应该包含这样的C头:
extern "C" {
#include <your_os_or_library_header_in_c.h>
}
Run Code Online (Sandbox Code Playgroud)
但到目前为止我发现的只是extern"C"只能保证关闭名称.
我找不到任何有关它是否将所有语句评估为C的信息,因此eg sizeof('a')或10 //* comment */ 2(您可以在内联函数中找到)被解析为C而不是C++.(请注意,依赖于编写C头的人这样的行为显然是一个坏主意,但我从纯粹的学术角度问"如果会怎么样?".)
C++标准是否说包含一段代码extern "C"意味着其中的所有语句都必须解析为C?
示例代码:
#include <iostream>
#include <cmath>
#include <stdint.h>
using namespace std;
static bool my_isnan(double val) {
union { double f; uint64_t x; } u = { val };
return (u.x << 1) > 0x7ff0000000000000u;
}
int main() {
cout << std::isinf(std::log(0.0)) << endl;
cout << std::isnan(std::sqrt(-1.0)) << endl;
cout << my_isnan(std::sqrt(-1.0)) << endl;
cout << __isnan(std::sqrt(-1.0)) << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用-ffast-math,该代码打印"0,0,1,1" - 没有,它打印"1,1,1,1".
那是对的吗?在这些情况下,我认为std::isinf/ std::isnan应该仍然可以使用-ffast-math.
另外,我如何检查无限/ NaN -ffast-math?您可以看到my_isnan这样做,它确实有效,但该解决方案当然非常依赖于架构.另外,为什么在 …
长话短说——我使用 Ted Krovetz 的实现来计算UMAC和UMAC AE加密 ( http://www.fastcrypto.org/ )。
当我用 编译我的代码(和/或中的测试umac.c)时-std=c99,计算出的结果UMAC与预期完全不同(并且是错误的)。当我删除这个选项时,一切都像魅力一样。
有什么想法可能导致这种情况吗?我可以做什么来检查发生了什么以及什么产生了不同的结果?
$ gcc --version
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
$ uname -a
xxx 3.13.0-43-generic #72-Ubuntu SMP .. x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
我不使用任何其他选项 - 只是使用和不使用-std=c99.
再说几句话:
我会尝试联系 Ted Krovetz 并向他询问这个问题(可能是一些错误或其他问题),但这不是重点。这个问题有点笼统,这个具体问题可以看作是一个例子。
我跑了valgrind——没什么特别的。添加-Wall并且-Wextra-什么也没有了。听起来像UB,但valgrind没有抱怨任何事情。
这种情况非常有趣,花了我很多天和头痛才明白,问题不在我的代码中(我使用这个实现来实现复杂的协议),而是在算法中,尤其是在这个选项中。所以我决定征求意见。
在 C 和 C++ 中都有效的代码在用每种语言编译时会产生不同的行为吗?根本不相关,因为我们在这里谈论的是同一种语言。
这种没有“-std=c99”的巨大 fprintf 速度差异很接近,但还不够。
编辑
这是我的测试结果和我所做的(源/标题刚刚下载,我没有更改任何内容): …
首先,抱歉问这么奇怪的问题
我在一个项目中使用了c,经过一些研究,我找到了一些更好的方法和一些c ++库,但我真的不想重写代码(例如,printf到cout).
我做了一些搜索,我得到了:"他们是两种非常不同的语言","不要做"等等,但我从来没有找到详细的解释
为什么?有一些推荐的文章可读吗?
假设有一个 C++ 类定义如下,
/* goo.h */
#ifdef __cplusplus
class goo{
public:
vector<int> a;
vector<int> b;
void calc();
};
#else
typedef struct goo goo;
#endif
#ifdef __cplusplus
extern "C" {
#if defined(__STDC__) || defined(__cplusplus)
void goo_calc(goo *);
#endif
#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)
然后我想goo::calc()用C实现,所以我写了以下代码。
/* goo_cpp.cpp */
#include "goo.h"
void goo::calc(){
goo_calc(this);
}
/* goo_c.c */
#include "goo.h"
void goo_calc(goo *g){
/* do something with g->a and g->b */
}
Run Code Online (Sandbox Code Playgroud)
但是gcc说goo has no fields named a and …