我最近开始用C编程,并且想知道一种更简洁的方法来编写一个返回1或-1的简单函数,具体取决于两个int值的相等性.我写的:
int valueCompare(int i, int j) {
if (i != j) {
return -1;
}
else {
return 1;
}
}
Run Code Online (Sandbox Code Playgroud)
它可读但似乎效率低下.我见过使用冒号和问号的return语句,但是我不熟悉那种风格.有没有人对如何在不损失可读性的情况下为此编写更高效的函数有任何建议?
我已经研究过,在编译时链接发生并在运行时执行.在每个函数的内联函数中,调用代码由内联函数定义替换,但函数调用在运行时完成.但是当我审阅一些书籍时,在编译时替换了代码.谁能告诉我在编译时或运行时完成内联代码替换?
最近我在我的代码块编程,我做了一个小程序只是为了C的爱好.
char littleString[1];
fflush( stdin );
scanf( "%s", littleString );
printf( "\n%s", littleString);
Run Code Online (Sandbox Code Playgroud)
如果我创建了一个字符串,为什么CodeBlocks允许我保存13个字符?
我已经开始使用Turbo C 2.01作为业余爱好项目.是的,DOS版本.自1987年问世以来,我认为它不支持C90 ......除此之外.好吧,它的碎片.该volatile关键字的工作.并且不支持直接K&R; 我尝试了K&R样式声明,出错了.
所以,我想知道什么形式的C Turbo C使用.我敢肯定它是非标准的,但似乎有些一致,而且由于这是当天非常受欢迎的编译器,我确信有一些信息收集......对吗?
我创建了一个具有文本输入最大尺寸的数组.现在,我想删除剩余的不必要的部分,以释放内存.我不允许使用std::string,我char[]只需要使用数组.
另外,如果您更了解如何仅使用char并为文本输入分配动态内存,请帮助我.我不知道用户将输入多少个字符
#include <iostream>
using namespace std;
int main()
{
char *text = new char[256];
cout << "Input text: ";
cin.getline(text,256,'\n');
while (cin.fail())
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max, '\n');
cout << "Input text: ";
cin.getline(text,256,'\n'); //need to delete part after '\n';
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在读"C简而言之",并且有很多与此类似的句子:
语句指定要执行的一个或多个操作,例如为变量赋值,将控制传递给函数或跳转到另一个语句.
我的问题是"执行"这些行为的是什么?
我已经在这里和那里读过C被定义为在抽象机器上运行,所以我的猜测是抽象机器应该执行这些操作,而像gcc这样的实际编译器的工作是确保如果你在精神上评估一个程序基于抽象机器的工作方式,你会得到与实际运行编译器生成的目标文件时相同的结果(在大多数情况下,在心理上评估程序是不可能的,但我在理论上讲这里).
抽象机器应该直接解释C代码(在预处理之后)吗?C应该被翻译成抽象机器解释的一些中间代码吗?抽象机器和C之间究竟有什么关系?
程序可见的抽象机的状态是什么?只有主存?如果抽象机器直接解释C代码,如何评估声明,它们如何改变抽象机器的状态?最后一系列问题只是为了让您了解C与它的抽象机器之间的精确关系是什么意思.
我有两个略有不同的结构,我想以某种方式链接以获得最快的结果.
这是两个结构:
/**
* @brief CAN Tx message structure definition
*/
typedef struct
{
uint32_t StdId; /*!< Specifies the standard identifier.
This parameter must be a number between Min_Data = 0 and Max_Data = 0x7FF */
uint32_t ExtId; /*!< Specifies the extended identifier.
This parameter must be a number between Min_Data = 0 and Max_Data = 0x1FFFFFFF */
uint32_t IDE; /*!< Specifies the type of identifier for the message that will be transmitted.
This parameter can be a value of …Run Code Online (Sandbox Code Playgroud) 所以,我正在尝试一些东西,我注意到如果你读取一个包含 11111111 作为无符号整数的地址,它显示值是 4294967295 而不是 255,这是为什么?
代码示例:
unsigned int a = 255;
unsigned int* p = &a;
char *p0 = (char*)p;
cout << (void*)p0 << " " <<(unsigned int)*p0<<endl;
Run Code Online (Sandbox Code Playgroud) 在 C 中,有没有办法为以下联合类型声明隐式类型转换:
enum COMP {
LessThan,
Equal,
GreaterThan
};
Run Code Online (Sandbox Code Playgroud)
将它映射到一个整数:
enum COMP {
LessThan : 1,
Equal : 0,
GreaterThan : -1
};
Run Code Online (Sandbox Code Playgroud) 我写这篇文章主要是为了澄清我在 Stackoverflow 上偶然发现的一些关于函数指针的令人困惑/误导的信息。
让我们从一个例子开始:
#include <iostream>
void func ()
{
std::cout<<"func here"<<'\n';
}
int main()
{
void (*fp)()=func;
void (&fref)()=func;
func();//call through function
(&func)();//call through function pointer
(*fp)();//call through function
fp();//call through function pointer
fref();//call through function
(&fref)();//call through function pointer
}
Run Code Online (Sandbox Code Playgroud)
这打印:
func here
func here
func here
func here
func here
func here
Run Code Online (Sandbox Code Playgroud)
可以看出,由于函数到函数指针的衰减cppreference,大多数时候可以使用函数来代替函数指针。
函数类型 T 的左值可以隐式转换为指向该函数的纯右值指针。这不适用于非静态成员函数,因为不存在引用非静态成员函数的左值。
但除此之外,函数指针看起来也可以用来代替函数,因为我可以使用它来调用函数而无需显式取消引用。
另请注意,您不需要使用一元 * 来通过函数指针进行调用;两者 (*p1_foo)(); 和 (p1_foo)(); 由于函数到函数指针的转换,具有相同的结果。
还有一个双重的便利:调用位置的函数指针会自动转换为函数值,因此您不必编写 * 来通过函数指针进行调用。
让它看起来好像存在一个隐式函数指针来进行函数转换。