4

私はそれを学びました

inline ostream & _Cdecl ostream::operator<< (const signed char * _s) {
    outstr(_s, (const signed char *)0);
    return *this;
}

iostream.hヘッダーファイルで挿入演算子(<<)が宣言(オーバーロード)される方法です。同じ関数を使用して文字列値を画面に出力できますか?

私は試した

#include<iostream.h>
int main() {
    outstr("Hello world!", (const signed char *)0);
    return 0;
}

それはエラーに終わった。printf、cout、puts()を使用せずに、画面に何かを印刷するというこのクエリに答える方法があるかどうかを確認するために、このようなものを使用したいと思います。

更新:他に何か提案があれば歓迎します

#include<stdlib.h>
void main() {
    system("echo /"Hello world!/"");
}

注意:printf()、cout、またはputs()なしで印刷できるCと同等のコードを提供できれば、制限はありません。

4

5 に答える 5

4

はい、関数を直接呼び出すことはできますが、そうする理由には欠陥があります。オペレーターへのサブルーチン呼び出しを排除することによって節約できる時間は、実際の機能を実行するのにかかる時間と比較するとごくわずかです。これは、雨を減らすためにコンバーチブルルーフが下がっている間に車の窓を閉めるようなものです。

于 2012-12-03T17:30:50.967 に答える
3

関数呼び出しを行うのに必要な時間は、文字列を印刷するのにかかる時間よりもはるか短くなります。アプローチによって節約できる時間は無視できます(通常は無視する必要があります)。

于 2012-12-03T17:32:43.157 に答える
3

すべての標準準拠のC++実装間での移植性が必要な場合は、次の方法で文字列を標準出力に出力できます。

const char * str = "Hello World\n";
fprintf(stdout, str);
fputs(str, stdout);
for (int i=0; str[i]!=0; ++i)
    putchar(str[i]);
for (int i=0; str[i]!=0; ++i)
    putc(str[i], stdout);
for (int i=0; str[i]!=0; ++i)
    fputc(str[i], stdout);
fwrite(str, sizeof(*str), strlen(str), stdout);

std::cerrさらに、とを使用できますstd::clogstderr彼らはの代わりに書き込みstdoutますが、ユーザーの観点からは、それはしばしば同じ場所です:

std::cerr << str;
std::clog << str;

効率の観点から、これらのいずれかがあなたを助けることになるとは思えません。そのために、もう少しプラットフォーム固有のものを確認することをお勧めします。POSIXシステムについては、DaveSによる回答を参照してください。Windowsの場合は、このリンクを参照してください。

すべきでないことは、ヘッダーファイルを開いて、それらが使用するものを模倣することです。少なくとも、彼らが彼ら自身の実装の中で異なる様々なあいまいな機能を使用している中間レベルではありません。これらの関数は、次のリリースでは存在しない可能性があります。ただし、最も深いレベルに進むと、上記のリンクにあるようなOS固有の呼び出しが見つかります。同じOSを使用している限り、またはOSのバージョン間でさえ、これらを安全に使用できるはずです。

于 2012-12-03T18:08:17.973 に答える
2

UNIXタイプのシステムでは、次のことができます。

#include <unistd.h>
#include <stdio.h>

int main()
  {
  const char x[] = "Hello World!";
  write(STDOUT_FILENO, x, strlen(x)); // Feel free to check the return value.
  return 0;
  }

これをやる動機はどうなるのか気になります。シグナルハンドラー以外では、このような低レベルの呼び出しには行きたくありません。I / Oのパフォーマンスは時間の主要な推進力であり、通常はかなり高度に最適化/インライン化されている中間関数呼び出しではありません。

于 2012-12-03T18:20:55.867 に答える
0

システムコールを直接使用できます。

http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html

たとえば、このページではLinuxシステムコールについて説明しています。コピーしたリンクから始めて、アセンブリを使用して多くのメソッドを使用するか、言い換えると、関数を呼び出さずに何かを行うことができます。

しかし、それはトリックの質問だったと思います。会社があれば、関数の代わりにシステムコールを使用する人を雇うことは決してありません。

これは、標準のoutput(1)でsys_write(4)を使用する例です。アセンブリコードをC/C++コードにインライン化できます。 http://docs.cs.up.ac.za/programming/asm/derick_tut/#helloworld

于 2012-12-03T18:06:52.433 に答える