小编Sha*_*our的帖子

如何在printf占位符中使用等于表达式?

我有以下代码片段:

main( )
{
int k = 35 ;
printf ( "\n%d %d %d", k == 35, k = 50, k > 40 ) ;
}
Run Code Online (Sandbox Code Playgroud)

产生以下输出

0 50 0
Run Code Online (Sandbox Code Playgroud)

我不知道我理解的第一个值怎么printf0.当值k与之比较时35,理想情况下它应该返回(并因此打印)1,但它如何打印为零?产生的其他两个值 - 50并且0都是正确的,因为在第二个值中,k的值被视为50,而对于第三个值,k的值(即35)被比较40.因为35 < 40,所以它打印0.

任何帮助将不胜感激,谢谢.

**更新**

在研究了关于这个主题的更多内容之后undefined behavior,我在一本关于C的书中看到了这一点,最后给出了源代码.

调用约定 调用约定表示在遇到函数调用时参数被传递给函数的顺序.这里有两种可能性:

  1. 参数可能从左向右传递.
  2. 参数可能从右到左传递.

C语言遵循第二顺序.

考虑以下函数调用:

fun (a, b, c, d ) ;
Run Code Online (Sandbox Code Playgroud)

在这个调用中,参数是从左向右还是从右向左传递并不重要.但是,在某些函数调用中,传递参数的顺序成为一个重要的考虑因素.例如:

int a = 1 ;
printf …
Run Code Online (Sandbox Code Playgroud)

c printf equality undefined-behavior assignment-operator

1
推荐指数
1
解决办法
420
查看次数

用short int补充运算符

#include <stdio.h>
#include <string.h>

main()
{
short int x=0x55AA;
printf("%x ",~x);
}
Run Code Online (Sandbox Code Playgroud)

上面的程序给出了输出:ffffaa55.我期待o/p只有aa55,因为short int是2个字节.有人可以解释一下吗?

c integer-promotion

1
推荐指数
2
解决办法
189
查看次数

处理班次运营商时出现意外行为

我的课程如下:

void main() {
   int n =0;
   printf("%x", (~0 << (32+ (~n +1) )));
}
Run Code Online (Sandbox Code Playgroud)

由于n = 0,~n = 0xffffffff == -1,所以~n + 1等于0.当我执行该程序时,我得到0xffffffff,这是不正确的,因为(~0 << 32)输出0.

当我用0替换(~n +1)时,它输出0.

很感谢任何形式的帮助.

c bit-manipulation bit-shift

1
推荐指数
1
解决办法
105
查看次数

std::size_t 的大小有多一致

我正在编写一组充当接口的纯虚拟类。这个想法是,实现此类接口的代码可以使用不同的构建配置、编译器,甚至不同的 STL 实现来构建,以通过此类接口使用此类对象。

像和一样的普通旧数据uint32_t是标准化的。(不是因为标准没有说明它的大小。)doublefloatbool

属于哪个类别std::size_t?它纯粹是机器架构的功能吗?例如,在 32 位机器上,它可能sizeof(std::size_t)不是 4?

c++ size-t abi c++11

1
推荐指数
1
解决办法
377
查看次数

不同翻译单元中内联函数的不同实现

C++标准说明了ODR,因为它适用于内联函数(强调我的):

3.2一个定义规则

3每个程序应包含该程序中每个非内联函数或变量的一个定义; 无需诊断.该定义可以在程序中明确显示,可以在标准或用户定义的库中找到,或者(在适当的时候)隐式定义(见12.1,12.4和12.8).内联函数应在每个使用它的翻译单元中定义.

它没有说明内联函数是否可以在不同的翻译单元中具有不同的实现.我尝试了以下方法:

test-1.cc

#include <iostream> 
inline std::ostream& foo(std::ostream& os)
{
   return os << "Foo_1";
}

void test_1()
{
   foo(std::cout) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

test-2.cc

#include <iostream> 
inline std::ostream& foo(std::ostream& os)
{
   return os << "Foo_2";
}

void test_2()
{
   foo(std::cout) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

main.cc

extern void test_1();
extern void test_2();

int main()
{
   test_1();
   test_2();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我期待看到以下输出:

Foo_1
Foo_2
Run Code Online (Sandbox Code Playgroud)

相反,我看到:

Foo_1
Foo_1
Run Code Online (Sandbox Code Playgroud)

我用它来测试它g++ 4.7.3.

g ++在选择其中一个内联实现时是否正确?是否不可能在不同的翻译单元中提供内联函数的不同实现?

c++ inline language-lawyer

1
推荐指数
1
解决办法
310
查看次数

修改const值的"undefined-ness"机制

我已经读过,它在某些C标准(可能是99?)中未定义,当修改const时会发生什么.但是一位学生向我提供了一些我修改过的代码.

我看不出常量变量的地址有什么特别之处a.我验证了它&a并且b是相同的,因此编译器不会巧妙地指向其他位置.然而,当我分配时*b,const值不会改变.

我没有运行优化.当我使用-g标志进行编译以进行调试并进入代码时,我得到了我期望的结果(变量的内存位置发生了a变化).然而,下面提供的代码并未反映更新后的价值a.

即使在调试模式下,这个temp现在也被放在寄存器中,没有优化吗?

#include <iostream>

using namespace std;

int main(){
    const int a = 15;
    cout << a << '\n';
    int * b= (int*)&a;
    cout << &a << "\n";
    cout << b << "\n";
    *b = 20;
    cout << *b << '\n';
    cout << a << '\n';

    int x = a;
    cout << x << '\n';
    x = *b;
    cout << …
Run Code Online (Sandbox Code Playgroud)

c++ pointers const undefined-behavior constantfolding

1
推荐指数
1
解决办法
77
查看次数

fflush()函数不能与stdin一起使用

对不起这个愚蠢的问题我很抱歉.我有C程序提示用户输入年龄和名称,然后将年龄和名称打印到屏幕上.这是我从书中读到的练习.

这个程序:

#include <stdio.h>

int main (void) {
   int age;
   char name[20];

   puts("Enter your age:");
   scanf("%d",&age);

   fflush(stdin);

   puts("Enter your name:");
   scanf("%s",name);

   printf("Your age is %d\n",age);
   printf("Your name is %s\n",name);

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我向第一个输入额外的字符时,scanf()程序终止并将额外的字符分配给下一个scanf()

然后我更改了代码,并添加了命名函数clear_buff()并使用其中的fgets函数clear_buff()来读取流上的剩余字符.代码按照我的预期工作.

#include <stdio.h>

#define MAXLEN 80

void clear_buff(void);

int main (void) {
  int age;
  char name[20];

  puts("Enter your age:");
  scanf("%d",&age);

  clear_buff();

  puts("Enter your name:");
  scanf("%s",name);

  printf("Your age is %d\n",age);
  printf("Your name is %s\n",name);

  return 0;
}

void clear_buff(void){ …
Run Code Online (Sandbox Code Playgroud)

c stdin fflush

1
推荐指数
1
解决办法
259
查看次数

模板作为递归函数工作

我找到了这段代码,并想知道我是否真的应该在我的真实项目中实现这样的东西.

令我困惑的事情是

  1. 这需要更多的编译时间,但我不应该以运行时为代价来打扰编译时间.

  2. 如果N真的是一个非常大的数字呢?源代码中是否有文件大小限制?

或者它的好事要知道,而不是实施?

#include <iostream>
using namespace std;

template<int N>
class Factorial {
public:
    static const int value = N * Factorial<N-1>::value;
};
template <>
class Factorial<1> {
public:
    static const int value = 1;
};

int main() {
  Factorial<5L> f;
  cout << "5! = " << f.value << endl;

    }
Run Code Online (Sandbox Code Playgroud)

输出:

5! = 120
Run Code Online (Sandbox Code Playgroud)

稍微修改一下,因为我正在玩代码,发现了

  Factorial<12> f1;  // works  
  Factorial<13> f2;  // doesn't work
Run Code Online (Sandbox Code Playgroud)

错误:

undefined reference to `Factorial<13>::value'
Run Code Online (Sandbox Code Playgroud)

是不是可以12进一步深入?

c++ templates

1
推荐指数
1
解决办法
589
查看次数

为什么GNU C++编译器允许您修改常量?

我正在通过GDB对用C++编写的项目进行调试,并发现在GNU C++编译器中没有警告或错误地修改了const.

这不是我正在调试的程序,但这是我目睹的行为的一个例子:

#include <iostream>

int main(int argc, char *argv[]) {
  const int x = 10;

  int *px = (int *)&x;
  ++*px;

  std::cout << "*px: " << *px << "\n";
  std::cout << "x: " << x << "\n";

  for (int i = 0; i < x; ++i)
    std::cout << i+1 << "\n";

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我不能代表其他编译器,因为我只使用GNU C++编译器4.9.2版进行了测试.为什么允许这样的事情?这打破了const对象的整个点.

我用g ++ main.c -Wall -Werror编译了上面的代码

输出:

*px: 11
x: 10
1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)

c++ gcc

1
推荐指数
1
解决办法
111
查看次数

无法将std :: cout传递给ostream和构造函数

我试图创建通用的流类持有者,但似乎我无法传递std::cout给它,代码:

#include <iostream>

struct x
{
    std::ostream &o;
    x(std::ostream &o):o(o){}
};

int main()
{
    x(std::cout);
    x.o<<"Hi\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译时失败:

c++ str.cc -o str -std=c++11
str.cc: In function ‘int main()’:
str.cc:11:14: error: invalid use of qualified-name ‘std::cout’
str.cc:12:4: error: expected unqualified-id before ‘.’ token
Run Code Online (Sandbox Code Playgroud)

为什么?

c++ cout

1
推荐指数
1
解决办法
188
查看次数